복붙노트

[SPRING] ServletRequestBindingException에 대한 Spring3 @ExceptionHandler

SPRING

ServletRequestBindingException에 대한 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. ==============================

    1.당신은 스프링 사용자 정의 구현으로 처리 할 수 ​​없습니다.

    당신은 스프링 사용자 정의 구현으로 처리 할 수 ​​없습니다.

    우아한 해결책은 아니지만 여전히 web.xml 태그로 잡을 수 있습니다. 여기에서 예외 유형 또는 오류 코드를 찾을 수 있습니다.

  2. ==============================

    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. ==============================

    3.불행히도 @ExceptionHandler 메서드는 핸들러 메서드 내에서 throw 된 예외에 대해서만 호출됩니다. ServletRequestBindingException은 핸들러 메소드를 호출하려고 할 때 발생하는 인프라 예외이며, 핸들러 메소드 자체를 어떤 이유로 든 호출 할 수없는 경우 @ExceptionHandler는 사용되지 않습니다.

    불행히도 @ExceptionHandler 메서드는 핸들러 메서드 내에서 throw 된 예외에 대해서만 호출됩니다. ServletRequestBindingException은 핸들러 메소드를 호출하려고 할 때 발생하는 인프라 예외이며, 핸들러 메소드 자체를 어떤 이유로 든 호출 할 수없는 경우 @ExceptionHandler는 사용되지 않습니다.

    이 문제를 처리하는 데 더 좋은 방법이없는 것 같습니다. 하지만 ServletRequestBindingException의 원인을 알지 못하면 조언하기가 어렵습니다.

  4. ==============================

    4.Juergen Hoeller에게 감사 드리며, 오늘 해결되어 Spring 4.3에 나타나야합니다.

    Juergen Hoeller에게 감사 드리며, 오늘 해결되어 Spring 4.3에 나타나야합니다.

    문제를 참조하십시오 : https://jira.spring.io/browse/SPR-11106

  5. from https://stackoverflow.com/questions/5153132/spring3-exceptionhandler-for-servletrequestbindingexception by cc-by-sa and MIT license