I am using a Default AnnotationMethodHandlerAdapter which I believe should enable support for @ExceptionHandler. Unluckily, a ServletRequestBindingException is thrown if a c
you cannot handle it with spring custom implementation.
it may not an elegant solution but you still can catch it with web.xml <error-page>
tag. you can catch exception type or error code from here.
Unfortunately, @ExceptionHandler
methods are only invoked for exceptions that are thrown from within the handler method. ServletRequestBindingException
is an infrastructure exception that is thrown whilst trying to invoke a handler method, and if the handler method itself cannot be invoked for whatever reason, then the @ExceptionHandler
is not used.
There doesn't really seem to be a nicer way to handle this. Without knowing what's causing your ServletRequestBindingException
, though, it's hard to advise.
Aaand thanks to Juergen Hoeller this has been solved today and should appear in Spring 4.3.
Please refer to the issue: https://jira.spring.io/browse/SPR-11106
This issue is fixed in Spring 3.2. You can create a global exception handler class with the @ControllerAdvice
annotation. Then in that class add an @ExceptionHandler
method to handle the ServletRequestBindingException and return a custom response body. Example:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ServletRequestBindingException.class)
public ResponseEntity<String> handleServletRequestBindingException(ServletRequestBindingException ex) {
return new ResponseEntity<String>("MISSING REQUIRED HEADER",HttpStatus.PRECONDITION_REQUIRED);
}
}
For more information check the spring mvc docs: 17.11 Handling exceptions