Spring Boot和自定义404错误页面

时间:2016-05-23 18:49:25

标签: java spring spring-mvc spring-boot thymeleaf

在我的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模板:

<!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>

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

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

9 个答案:

答案 0 :(得分:48)

在Spring Boot 1.4.x中,您可以添加custom error page

  

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

     

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

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

答案 1 :(得分:24)

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

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

Thymleaf error.html

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

答案 2 :(得分:4)

  

新的错误页面(HttpStatus.NOT_FOUND,“ /404.html ”)

/404.html代表网址重定向,而非模板名称。由于您坚持使用模板,因此您应该创建一个处理/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页面通常是静态的,使用模板代替 Plain Old HTMLs 不会有那么多意义。

答案 3 :(得分:4)

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

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

一个简单的例子(在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>

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

答案 4 :(得分:4)

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

<!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>

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

答案 5 :(得分:1)

enter image description here在Spring Boot Application中非常容易做到。 Spring Boot最能为我们完成所有事情。

1)在路径src / main / resources / templates中 制作名称为“错误”的文件夹

2)接下来在此文件夹中创建html文件, 将其另存为“ 404.html”。

您在这里完成了传达

Spring Boot如果出现404页面未找到错误,将自动显示此页面。

注意:在进行此操作之前,请确保已将Thymeleaf存储库添加到pom中。 xml

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我们必须添加新的

 @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";
    }
}

答案 8 :(得分:0)

检查类路径中是否存在百里香叶,或添加以下代码并重新导入项目。

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>