コントローラでグローバルにスローされた例外を処理するために@RestControllerAdviceを使用し、クライアントに応答jsonの文字列を処理します。私の残りのコントローラ@RequestMappingパスは、ファイル拡張子の後ろにURLを受け入れることができます。コントローラが例外をスローし、URLに既知の拡張子が付いている場合、例外ハンドラはjsonの代わりにhtmlを返します。URLがファイル拡張子の後に続く場合、Spring Restful ControllerAdvice例外ハンドラの応答html
build.gradle
...
dependencies {
compile 'com.google.code.gson:gson:2.7'
compileOnly 'org.apache.tomcat:tomcat-servlet-api:8.0.33'
compile 'org.springframework:spring-webmvc:4.3.1.RELEASE'
}
サーブレットのcontext.xml
...
<mvc:annotation-driven/>
<context:component-scan base-package="com.demo"/>
...
DemoController.java
@RestController
public class DemoRestController {
@RequestMapping(value = "/{name:.+}")
public String doSomething(@PathVariable String name){
throw new RuntimeException(name);
}
}
RestExceptionHandler
@RestControllerAdvice
public class RestExceptionHandler {
@ExceptionHandler(Exception.class)
public Message handleException(Exception ex, WebRequest request) {
Message ret=new Message(System.currentTimeMillis(),ex.getMessage());
return ret;
}
}
クライアント
$ curl localhost:8080/abc //no extension, it's ok
{"time":1479235304196,"url":"abc"}
$ curl localhost:8080/abc.opq //unknown extension, ok
{"time":1479235545303,"url":"abc.opq"}
$ curl localhost:8080/abc.jpg
<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.33 - Error report</title> ...
...
最後の出力がHTMLである、それはのはどのような、私は望んでいないのですか?助けてくれますか、ありがとう!