2016-11-15 10 views
1

コントローラでグローバルにスローされた例外を処理するために@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である、それはのはどのような、私は望んでいないのですか?助けてくれますか、ありがとう!

答えて

0

リクエストパスに未知の拡張子があると、SpringはhandleExceptionからの戻り値をどのように処理するのかを知らず、HTMLにフォールバックするようです。 JSONをhandleExceptionメソッドで直接レンダリングすることでこれを修正できます。私の場合、protobufやcsvなどではなく、エラーが発生した場合にAPIが常にJSONを返すため、これは私のケースでは機能しました。

@RestControllerAdvice(annotations = {RestController.class}) 
public class ApiExceptionHandler { 

    private final ObjectMapper objectMapper; 

    public ApiExceptionHandler(ObjectMapper objectMapper) { 
     this.objectMapper = objectMapper; 
    } 

    @ExceptionHandler 
    public void exceptionHandler(HttpServletRequest req, HttpServletResponse res, Exception x) throws IOException { 
     Message ret = new Message(System.currentTimeMillis(),ex.getMessage()); 
     res.setStatus(500); 
     res.setContentType(MediaType.APPLICATION_JSON_UTF8.toString()); 
     objectMapper.writeValue(res.getOutputStream(), ret); 
    } 
} 
関連する問題