Este tutorial ha sido analizado por especialistas así aseguramos la exactitud de esta sección.
Solución:
La aplicación Spring Boot tiene una configuración predeterminada para el manejo de errores: ErrorMvcAutoConfiguration.
Lo que hace básicamente, si no se proporciona una configuración adicional:
- crea un controlador de error global predeterminado – BasicErrorController
- crea un ‘error’ predeterminado static ver ‘Página de error de etiqueta blanca’.
BasicErrorController
está conectado a ‘/ error’ de forma predeterminada. Si no hay una vista de ‘error’ personalizada en la aplicación, en caso de una excepción lanzada desde cualquier controlador, el usuario aterriza en la página de etiqueta blanca /error, llena con información de BasicErrorController.
Si la aplicación tiene un controlador que implementa ErrorController
eso reemplazaBasicErrorController
.
Si ocurre alguna excepción en el controlador de manejo de errores, pasará por el filtro de excepciones de Spring (vea más detalles a continuación) y, finalmente, si no se encuentra nada, esta excepción será manejada por el contenedor de la aplicación subyacente, por ejemplo, Tomcat. El contenedor subyacente manejará la excepción y mostrará alguna página/mensaje de error dependiendo de su implementación.
Hay un dato interesante en BasicErrorController
javadoc:
Controlador de error global básico, renderizando ErrorAttributes. Los errores más específicos se pueden manejar utilizando abstracciones de Spring MVC (p. ej. @Manejador de excepciones) o agregando páginas de error del servidor servlet.
BasicErrorController
o ErrorController
la implementación es un controlador de errores globales. Se puede usar junto con @ExceptionHandler.
Aquí llegamos a ResponseEntityExceptionHandler
Una clase base conveniente para las clases de @ControllerAdvice que desean proporcionar un manejo centralizado de excepciones en todos los métodos de @RequestMapping a través de los métodos de @ExceptionHandler. Esta clase base proporciona un método @ExceptionHandler para manejar excepciones internas de Spring MVC.
En otras palabras, eso significa que ResponseEntityExceptionHandler
es solo una clase de conveniencia, que ya contiene el manejo de excepciones de Spring MVC. Y podemos usarlo como clase base para nuestra clase personalizada para manejar las excepciones de los controladores. Para que nuestra clase personalizada funcione, debe anotarse con @ControllerAdvice
.
Clases anotadas con @ControllerAdvice
se puede utilizar al mismo tiempo que el controlador de errores global (BasicErrorController
o ErrorController
implementación). Si nuestro @ControllerAdvice
clase anotada (que puede/o no extender ResponseEntityExceptionHandler
) no maneja alguna excepción, la excepción va al controlador de errores global.
Hasta ahora miramos ErrorHandler
controlador y cualquier cosa anotada con @ControllerAdvice
. Pero es mucho más complicado. Encontré una idea realmente valiosa en la pregunta: Establecimiento de precedencia de múltiples @ControllerAdvice @ExceptionHandlers.
Editar:
Para mantenerlo simple:
- First Spring busca un controlador de excepciones (un método anotado con @ExceptionHandler) dentro de las clases de @ControllerAdvice. Consulte ExceptionHandlerExceptionResolver.
- Luego verifica si la excepción lanzada está anotada con @ResponseStatus o se deriva de ResponseStatusException. Consulte ResponseStatusExceptionResolver.
- Luego pasa por los controladores predeterminados de las excepciones de Spring MVC. Consulte DefaultHandlerExceptionResolver.
- Y al final, si no se encuentra nada, el control se reenvía a la vista de página de error con el controlador de error global detrás. Este paso no se ejecuta si la excepción proviene del propio controlador de errores.
- Si no se encuentra ninguna vista de error (por ejemplo, el controlador de errores global está deshabilitado) o se omite el paso 4, el contenedor maneja la excepción.
Comentarios y valoraciones del post
Finalizando este artículo puedes encontrar las referencias de otros gestores de proyectos, tú igualmente tienes la libertad de dejar el tuyo si lo deseas.