[SPRING] ServletRequestBindingException에 대한 Spring3 @ExceptionHandler
SPRINGServletRequestBindingException에 대한 Spring3 @ExceptionHandler
@ExceptionHandler를 지원해야한다고 생각하는 Default AnnotationMethodHandlerAdapter를 사용하고 있습니다. 불행하게도 ServletRequestBindingException이 발생합니다. ServletRequestBindingException은 아래와 같은 핸들러 메소드에 대한 호출이 들어오고 Exception 핸들러가 호출되지 않으면 Throw됩니다.
@RequestMapping(value = "/v1/products/{code}", method = RequestMethod.GET, headers = "Accept=application/xml,application/json")
@ResponseBody
public ProductDemoDTO getProductByCode(@PathVariable final String code,
@RequestParam(required = false, defaultValue = "BASIC") final String options)
{
//omitted
}
ExceptionHandler는 결코 호출되지 않았습니다 :
@ExceptionHandler(Throwable.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
//TODO not being called?
public void handleException(final Exception e, final HttpServletRequest request, final Writer writer) throws IOException
{
writer.write(String.format("{\"error\":{\"java.class\":\"%s\", \"message\":\"%s\"}}", e.getClass(), e.getMessage()));
}
누구도 ExceptionHandler가 호출되지 않는 이유를 알고 있습니까?
해결법
-
==============================
1.당신은 스프링 사용자 정의 구현으로 처리 할 수 없습니다.
당신은 스프링 사용자 정의 구현으로 처리 할 수 없습니다.
우아한 해결책은 아니지만 여전히 web.xml
태그로 잡을 수 있습니다. 여기에서 예외 유형 또는 오류 코드를 찾을 수 있습니다. -
==============================
2.이 문제는 Spring 3.2에서 수정되었습니다. @ControllerAdvice 주석을 사용하여 전역 예외 핸들러 클래스를 만들 수 있습니다. 그런 다음 해당 클래스에서 @ExceptionHandler 메소드를 추가하여 ServletRequestBindingException을 처리하고 사용자 정의 응답 본문을 리턴하십시오. 예:
이 문제는 Spring 3.2에서 수정되었습니다. @ControllerAdvice 주석을 사용하여 전역 예외 핸들러 클래스를 만들 수 있습니다. 그런 다음 해당 클래스에서 @ExceptionHandler 메소드를 추가하여 ServletRequestBindingException을 처리하고 사용자 정의 응답 본문을 리턴하십시오. 예:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ServletRequestBindingException.class) public ResponseEntity<String> handleServletRequestBindingException(ServletRequestBindingException ex) { return new ResponseEntity<String>("MISSING REQUIRED HEADER",HttpStatus.PRECONDITION_REQUIRED); } }
자세한 내용은 spring mvc docs : 17.11 예외 처리를 참조하십시오.
-
==============================
3.불행히도 @ExceptionHandler 메서드는 핸들러 메서드 내에서 throw 된 예외에 대해서만 호출됩니다. ServletRequestBindingException은 핸들러 메소드를 호출하려고 할 때 발생하는 인프라 예외이며, 핸들러 메소드 자체를 어떤 이유로 든 호출 할 수없는 경우 @ExceptionHandler는 사용되지 않습니다.
불행히도 @ExceptionHandler 메서드는 핸들러 메서드 내에서 throw 된 예외에 대해서만 호출됩니다. ServletRequestBindingException은 핸들러 메소드를 호출하려고 할 때 발생하는 인프라 예외이며, 핸들러 메소드 자체를 어떤 이유로 든 호출 할 수없는 경우 @ExceptionHandler는 사용되지 않습니다.
이 문제를 처리하는 데 더 좋은 방법이없는 것 같습니다. 하지만 ServletRequestBindingException의 원인을 알지 못하면 조언하기가 어렵습니다.
-
==============================
4.Juergen Hoeller에게 감사 드리며, 오늘 해결되어 Spring 4.3에 나타나야합니다.
Juergen Hoeller에게 감사 드리며, 오늘 해결되어 Spring 4.3에 나타나야합니다.
문제를 참조하십시오 : https://jira.spring.io/browse/SPR-11106
from https://stackoverflow.com/questions/5153132/spring3-exceptionhandler-for-servletrequestbindingexception by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Jersey 2 + Spring : @Autowired는 null입니다. (0) | 2019.01.22 |
---|---|
[SPRING] ItemReader 및 ItemWriter를 사용하지 않고 Spring 배치 작업을 작성할 수 있습니까? (0) | 2019.01.22 |
[SPRING] 키 'PRIMARY'에 대한 중복 항목 'string1-string2' (0) | 2019.01.22 |
[SPRING] JSP 페이지에서 렌더링되지 않은 스크립트 태그 (Spring + Tiles + JSPX 사용) (0) | 2019.01.22 |
[SPRING] spring4 @RestController를 사용하여 jsp 페이지를 반환하는 방법? (0) | 2019.01.22 |