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:
HandlerExceptionResolver |
Descripción |
---|---|
|
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. |
Reconoce excepciones lanzadas por Spring MVC y las asigna a códigos de estado HTTP. Consulte
también la alternativa |
|
|
Reconoce excepciones con la anotación |
|
Reconoce excepciones llamando a un método marcado con la anotación
|
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:
@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;
}
}
@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
}
}
WebApplicationInitializer
o un simple web.xml
.