Si se produce una excepción durante la representación de la solicitud o se genera desde un controlador de solicitudes (como un @Controller anotado), DispatcherServlet delega autoridad al HandlerExceptionResolver cadena de beans para reconocer la excepción y proporcionar un manejo alternativo, que suele ser un mensaje de error.

La siguiente tabla enumera las implementaciones de HandlerExceptionResolver disponibles:

Tabla 2. Implementaciones de HandlerExceptionResolver
HandlerExceptionResolver Descripción

SimpleMappingExceptionResolver

Asignación entre nombres de clases de excepción y nombres de representación de errores. Se utiliza para representar páginas de error en una aplicación de navegador.

DefaultHandlerExceptionResolver

Reconoce excepciones lanzadas por Spring MVC y las asigna a códigos de estado HTTP. Consulte también la alternativa ResponseEntityExceptionHandler.

ResponseStatusExceptionResolver

Reconoce excepciones con la anotación @ResponseStatus y las asigna a códigos de estado HTTP según el valor de la anotación.

ExceptionHandlerExceptionResolver

Reconoce excepciones llamando a un método marcado con la anotación @ExceptionHandler en una clase con la anotación @Controller o la anotación @ControllerAdvice.

Cadena de resolutores

Puede encadenar solucionadores de excepciones declarando múltiples beans HandlerExceptionResolver en su configuración de Spring y ajustando sus propiedades order según sea necesario. Cuanto mayor sea la propiedad del pedido, más lejos se ubicará el controlador de excepciones.

El contrato HandlerExceptionResolver especifica que puede devolver:

  • ModelAndView indicando la vista de error.

  • Vaciar ModelAndView si la excepción se manejó dentro del solucionador.

  • null si la excepción no se reconoce, para intentos posteriores realizados por los solucionadores, pero si la excepción finalmente persiste, se permite ingresar al contenedor de servlets.

La configuración de MVC declara automáticamente controladores integrados para las excepciones predeterminadas de Spring MVC, para las excepciones anotadas @ResponseStatus y para admitir métodos anotados con @ExceptionHandler. Esta lista se puede modificar o reemplazar.

Página de error del contenedor

Si la excepción no es reconocida por ningún HandlerExceptionResolver y, por lo tanto, continúa propagándose, o si el estado de la respuesta se establece en error (es decir, 4xx, 5xx), los contenedores de servlets pueden representar una página de error predeterminada en HTML. . Para personalizar la página de error predeterminada del contenedor, puede declarar la visualización de la página de error en web.xml. El siguiente ejemplo muestra cómo hacer esto:

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

Dado el ejemplo anterior, si ocurre una excepción o la respuesta tiene un estado de error, el contenedor de servlets envía internamente un ERROR a la URL configurada (por ejemplo, /error). Luego, todo esto es procesado por el DispatcherServlet, posiblemente mapeándolo a una anotación @Controller, que se puede implementar para devolver el nombre de una vista de error con un modelo, o para generar una respuesta en formato JSON, como se muestra en el siguiente ejemplo:

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
    }
}
La API de servlet no proporciona la capacidad de crear visualizaciones de páginas de error en Java. Sin embargo, puede utilizar WebApplicationInitializer o un simple web.xml.