java - springboot - Spring Boot y página de error 404 personalizada
springboot error page (8)
En mi aplicación Spring Boot, estoy tratando de configurar páginas de error personalizadas, por ejemplo para 404, he agregado un Bean siguiente a la configuración de mi aplicación:
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html"));
}
};
}
Además, he creado una siguiente plantilla simple de Thymeleaf:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<title>404 Not Found</title>
<meta charset="utf-8" />
</head>
<body>
<h3>404 Not Found</h3>
<h1 th:text="${errorCode}">404</h1>
<p th:utext="${errorMessage}">Error java.lang.NullPointerException</p>
<a href="/" th:href="@{/}">Back to Home Page</a>
</body>
</html>
y lo agregué a
/resources/templates/
folder.
En este momento en el error 404 solo puedo ver la pantalla en blanco.
¿Qué estoy haciendo mal y cómo configurar correctamente mi página 404? Además, ¿es posible usar plantillas y no solo páginas estáticas para páginas de error personalizadas?
ErrorPage nuevo (HttpStatus.NOT_FOUND, " /404.html ")
Ese
/404.html
representa la
ruta de URL para redirigir
, no el nombre de la plantilla.
Dado que insiste en usar una plantilla, debe crear un controlador que maneje
/404.html
y
/404.html
que su
404.html
reside en
src/main/resources/templates
:
@Controller
public class NotFoundController {
@RequestMapping("/404.html")
public String render404(Model model) {
// Add model attributes
return "404";
}
}
También puede reemplazar estos solo controladores de renderizado de visualización con un Controlador de visualización:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/404.html").setViewName("404");
}
}
Además, ¿es posible usar plantillas y no solo páginas estáticas para páginas de error personalizadas?
Si es posible. Pero las páginas no encontradas suelen ser estáticas y el uso de una plantilla en lugar de HTML simples no tendría mucho sentido.
En Spring Boot 1.4.x puede agregar una página de error personalizada :
Si desea mostrar una página de error HTML personalizada para un código de estado determinado, agregue un archivo a una carpeta
/error
. Las páginas de error pueden ser HTML estático (es decir, agregado en cualquiera de las carpetas de recursos estáticos) o construidas con plantillas. El nombre del archivo debe ser el código de estado exacto o una máscara de serie.Por ejemplo, para asignar 404 a un archivo HTML estático, la estructura de su carpeta se vería así:
src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
Estás utilizando Thymeleaf, y Thymeleaf puede manejar el error sin un controlador.
Para una página de error genérico, esta página de Thymeleaf debe nombrarse como
error.html
y debe colocarse en
src/main/resources > templates > error.html
Para páginas de error específicas, debe crear archivos con el nombre de código de error http en una carpeta llamada error, como:
src/main/resources/templates/error/404.html
.
No es necesario el bean
EmbeddedServletContainerCustomizer
.
Simplemente poner la página de error correspondiente (como 404.html en el caso de 404) en el directorio público debería ser suficiente (como lo señaló @brunoid).
También tenga en cuenta que también puede poner una página genérica
error.html
que se mostrará cada vez que su aplicación encuentre un error o una excepción.
Un ejemplo simple (en Freemarker):
<html lang="en">
<head>
</head>
<body>
<div class="container">
<div class="jumbotron alert-danger">
<h1>Oops. Something went wrong</h1>
<h2>${status} ${error}</h2>
</div>
</div>
</body>
</html>
Esto mostrará el estado de error adecuado y el mensaje de error correspondiente. Y dado que está utilizando Spring Boot, siempre puede anular el estado y los mensajes de error que se muestran en su página de error.
Si está utilizando Thymeleaf como se sugiere en la pregunta, puede usar una plantilla similar a la de la respuesta anterior, pero apropiada para Thymeleaf en lugar de Freemarker. También he agregado bootstrap para el estilo:
<!DOCTYPE html>
<html lang="en"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Error Page</title>
<link href="/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css" rel="stylesheet" media="screen"/>
<script src="/webjars/jquery/3.2.1/jquery.min.js"></script>
<script src="/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="jumbotron alert-danger">
<h1>Oops... something went wrong.</h1>
<h2 th:text="${status + '' '' + error}"></h2>
</div>
</div>
</body>
</html>
Debe colocar este código en un archivo llamado
error.html
y colocarlo en su directorio de plantillas de hoja de tomillo.
No es necesario agregar un controlador adicional para que funcione.
Tenemos que agregar nuevos
@Controller
public class MyErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if(statusCode == HttpStatus.NOT_FOUND.value()) {
return "error404";
}
else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
return "error500";
}
}
return "error";
}
@Override
public String getErrorPath() {
return "/error";
}
}
Thymeleaf puede manejar el error sin un controlador. cree error.html en la carpeta de recursos.
Verifique si tiene hoja de tomillo presente en el classpath, o agregue el siguiente código y vuelva a importar el proyecto.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>