2016-06-14 2 views
0

그래서 내가 입력에게 요청 본문 소요 컨트롤러가 있습니다스프링 부트 - Jackson에서 UnrecognizedPropertyException을 수동으로 처리하는 방법은 무엇입니까?

@RestController 
@RequestMapping("/foo/bar") 
public class FooBarController { 
    @RequestMapping(method = RequestMethod.POST) 
    public ResponseEntity<?> doTheFoo(@RequestBody MyDto dto) { 
     ... 
    } 
} 

을 그리고 나는이 FOOBAR 있습니다

public clas FooBar { 
    @JsonProperty("foo") 
    private String foo; 

    public void setFoo(String foo) { ... } 
    public String getFoo() { ... } 
} 

그리고 알 수없는 특성에 실패 내 속성에서 설정 한 :

spring.jackson.deserialization.fail-on-unknown-properties: true 

또한 실패를 캡처하고 처리 할 수있는 처리기가 있습니다.

@ControllerAdvice 
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { 
    @ExceptionHandler(UnrecognizedPropertyException.class) 
    public ResponseEntity<?> handleUnrecognizedPropertyException(UnrecognizedPropertyException ex) { 
     ... 
    } 
} 

하지만 알 수없는 속성으로 내 끝점에 POST 할 때 (예 : {"bar": "baz"}), GlobalExceptionHandler가 실행되지 않고 바닐라 400 BAD REQUEST가 리턴됩니다. 알 수없는 속성 예외를 가로 채고 다른 응답을 제공하려면 어떻게합니까?

+1

알 수없는 속성이 게시되지 않으면 컨트롤러가 올바르게 작동합니까? – dieend

+0

그건 중요하지 않습니다. 400 오류 요청이있는 빈 페이지가 아니라 사용자 지정 오류 페이지를 반환하고 싶습니다. – Ben

+0

4xx는 클라이언트 오류 요청이기 때문에 묻습니다. 컨트롤러가 json을 요청하는 동안 게시물이 양식으로 전송 되었기 때문입니까? 아니면 예외 처리기가 지정된 예외를 포착하지 못하게 만든 다른 이유 일 수 있습니다. – dieend

답변

0

제대로 속성을 사용하고 컨트롤러가 제대로 작동하면 HttpMessageNotReadableException 예외를 가로 챌 수 있습니다.

+0

내가 가진 추가 문제는 확장 된 ResponseEntityExceptionHandler 클래스를 무시할 수 없다는 것이 었습니다. 원래는 게시물에 없었습니다. 감사! – Ben

-1

스프링 부트의 BasicErrorController를 사용해보십시오. 이것은 다음과 같이 보일 것입니다.

@Controller 
    @RequestMapping 
    public class ErrorController { 
    @RequestMapping(value = "/error/404.html") 
    @ResponseStatus(value = HttpStatus.NOT_FOUND) 
    public String pageNotFoundError(HttpServletRequest request) { 
     "errors/404" 
    } 
관련 문제