If an exception occurs during request rendering or is thrown from a request handler (such as an annotated @Controller), DispatcherServlet delegates authority to the HandlerExceptionResolver bean chain to recognize the exception and provide alternative handling, which is usually an error message.

The following table lists the available HandlerExceptionResolver implementations:

Table 2. Implementations of HandlerExceptionResolver
HandlerExceptionResolver Description

SimpleMappingExceptionResolver

Map between exception class names and error representation names. Used to render error pages in a browser application.

DefaultHandlerExceptionResolver

Recognizes exceptions thrown by Spring MVC and maps them to HTTP status codes. See also the alternative ResponseEntityExceptionHandler.

ResponseStatusExceptionResolver

Recognizes exceptions with the @ResponseStatus annotation and maps them to HTTP status codes based on the value in the annotation.

ExceptionHandlerExceptionResolver

Recognizes exceptions by calling a method marked with the @ExceptionHandler annotation in a class with the @Controller annotation or the @ControllerAdvice annotation.

Chain of resolvers

You can chain exception resolvers by declaring multiple HandlerExceptionResolver beans in your Spring configuration and adjusting their order properties as needed. The higher the order property, the further away the exception handler is located.

The HandlerExceptionResolver contract specifies that it can return:

  • ModelAndView indicating the error view.

  • Empty ModelAndView if the exception was handled inside the resolver.

  • null if the exception remains unrecognized, for subsequent attempts made by resolvers, but if the exception ultimately persists, then it is allowed into the servlet container.

The MVC configuration automatically declares built-in handlers for default Spring MVC exceptions, for @ResponseStatus annotated exceptions, and to support methods annotated with @ExceptionHandler. This list can be modified or replaced.

Container error page

If the exception remains unrecognized by any HandlerExceptionResolver and therefore continues to propagate, or if the response status is set to error (i.e. 4xx, 5xx), servlet containers can render a default error page at HTML. To customize the container's default error page, you can declare the error page display in web.xml. The following example shows how to do this:

<error-page>
    <location>/error</location>
</error-page>

Given the previous example, if an exception occurs or the response has an error status, the servlet container internally sends an ERROR to the configured URL (for example, /error). This is all then processed by the DispatcherServlet, by possibly mapping it to a @Controller annotation, which can be implemented to return the name of an error view with a model, or to output a response in JSON format, as shown in the following example:

Java
@RestController
public class ErrorController {
    @RequestMapping(path = "/error")
    public Map<String, Object> handle(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("status", request.getAttribute("javax.servlet.error.status_code"));
        map.put("reason", request.getAttribute("javax.servlet.error.message"));
        return map;
    }
}
Kotlin
@RestController
class ErrorController {
    @RequestMapping(path = ["/error"])
    fun handle(request: HttpServletRequest): Map<String, Any> {
        val map = HashMap<String, Any>()
        map["status"] = request.getAttribute("javax.servlet.error.status_code")
        map["reason"] = request.getAttribute("javax.servlet.error.message")
        return map
    }
}
The Servlet API does not provide the ability to create error page displays in Java. However, you can use either WebApplicationInitializer or a simple web.xml.