Exploring basic features of exception handling in Spring (@ControllerAdvice
).
Reference: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html
Reference: https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
Reference: http://www.baeldung.com/exception-handling-for-rest-with-spring
Before Spring 3.2
, the main approach to handling exceptions in a
Spring MVC
application was @ExceptionHandler
annotation.
After 3.2
we now have the new @ControllerAdvice
annotation to address
the limitations of the previous one.
@ExceptionHandler
drawback: is active only for that particular Controller.public class FooController{ //... @ExceptionHandler({ CustomException1.class, CustomException2.class }) public void handleException() { // } }
A controller advice allows you to use similar exception handling
techniques to @ExceptionHandler
but apply them across the whole application,
not just to an individual controller. You can think of them as an annotation
driven interceptor.
Any class annotated with @ControllerAdvice
becomes a controller-advice, then
we have to write method that will handle specific exception:
@ResponseStatus(code = HttpStatus.NOT_FOUND)
@ExceptionHandler(EntityNotFoundException.class)
@ResponseBody
ApplicationExceptionAsJSON entityNotFoundException(@NonNull HttpServletRequest request,
@NonNull EntityNotFoundException ex) {
Preconditions.checkArgument(nonNull(request.getRequestURI()));
Preconditions.checkArgument(nonNull(ex.getLocalizedMessage()));
return ApplicationExceptionAsJSON.builder()
.url(request.getRequestURI())
.message(ex.getLocalizedMessage())
.build();
}
EntityNotFoundExceptionInterceptor
is@ControllerAdvice