Spring Boot和自定义404错误页面

在我的Spring Boot应用程序中,我正在尝试配置自定义错误页面,例如对于404,我在应用程序配置中添加了以下Bean:

@Bean public EmbeddedServletContainerCustomizer containerCustomizer() { return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404.html")); } }; } 

另外,我创建了以下简单的Thymeleaf模板:

    404 Not Found    

404 Not Found

404

Error java.lang.NullPointerException

Back to Home Page

并将其添加到/resources/templates/文件夹中。 就在404错误我只能看到白屏。

我做错了什么以及如何正确设置我的404页面? 此外,是否可以使用模板而不仅仅是自定义错误页面的静态页面?

在Spring Boot 1.4.x中,您可以添加自定义错误页面 :

如果要显示给定状态代码的自定义HTML错误页面,请将文件添加到/error文件夹。 错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板构建。 文件名应该是确切的状态代码或系列掩码。

例如,要将404映射到静态HTML文件,您的文件夹结构将如下所示:

 src/ +- main/ +- java/ | +  +- resources/ +- public/ +- error/ | +- 404.html +-  

你正在使用Thymeleaf,Thymeleaf可以在没有控制器的情况下处理错误。

对于通用错误页面,此Thymeleaf页面需要命名为error.html
并应放在src/main/resources > templates > error.html

Thymleaf error.html

对于特定的错误页面,您需要在名为error的文件夹中创建名为http错误代码的文件,例如: src/main/resources/templates/error/404.html

新的ErrorPage( HttpStatus.NOT_FOUND ,“/ 404.html ”)

/404.html表示重定向URL路径 ,而不是模板名称。 因为,你坚持使用模板,你应该创建一个处理/404.html的控制器,并渲染你的404.html驻留在src/main/resources/templates

 @Controller public class NotFoundController { @RequestMapping("/404.html") public String render404(Model model) { // Add model attributes return "404"; } } 

您还可以使用View Controller替换这些仅视图渲染器控制器

 @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/404.html").setViewName("404"); } } 

此外,是否可以使用模板而不仅仅是自定义错误页面的静态页面?

是的,这是可能的。 但是Not Found页面通常是静态的,使用模板而不是普通的旧HTML不会有那么多意义。

不需要EmbeddedServletContainerCustomizer bean。 简单地将相应的错误页面(例如404中的404.html)放在公共目录中应该足够了(如@brunoid指出的那样)。

另请注意,您还可以放置一个通用的error.html页面,只要您的应用程序遇到错误或exception,它就会显示出来。

一个简单的例子(在Freemarker中) –

     

Oops. Something went wrong

${status} ${error}

这将显示正确的错误状态和相应的错误消息。 由于您使用的是Spring Boot,因此您始终可以覆盖错误页面上显示的状态和错误消息。

如果您使用问题中建议的Thymeleaf,您可以使用类似于上一个回复的模板,但适用于Thymeleaf而不是Freemarker。 我还为样式添加了bootstrap:

    Error Page      

Oops... something went wrong.

您应将此代码放在名为error.html的文件中,并将其放在thymeleaf模板目录中。 无需添加额外的控制器即可工作。

Thymeleaf可以在没有控制器的情况下处理错误。 创建error.html到资源文件夹。