2016-05-23 46 views
14

在我的春节,启动应用程序,我想配置自定义错误页,例如用于404,我加了以下豆到我的应用程序配置:春天引导和自定义404错误页面

@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页面?另外,是否可以使用模板,而不仅仅是用于自定义错误页面的静态页面?

回答

35

在春季启动的1.4.x可以添加custom error page

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

例如,映射404静态HTML文件,文件夹结构是这样的:

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

我试过把资源/ public/error下的我的404.html放在/ resources/error下面,仍然没有被SB 1.4拾取。我得到了通用的404消息。任何想法如何排除故障? –

+0

thxü使我的一天 –

4

新的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"; 
    } 
} 

你也可以更换这些只是查看渲染-ER与视图控制器控制器:

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

此外,是否有可能使用模板和 自定义错误页,不仅静态网页?

是的,这是可能的。但未找到页面通常是静态的,并使用模板而不是Plain Old HTML不会产生太大的意义。

+1

如果我想将页眉/页脚代码包含到我的404页面中,该怎么办? –

3

没有必要为EmbeddedServletContainerCustomizer豆。简单地将相应的错误页面(例如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,因此您始终可以覆盖显示在错误页面上的状态和错误消息。

+0

你可以扩大“Freemarker”? –

+0

Freemarker(http://freemarker.org)是一种视图技术(如JSP或Thymeleaf)。你不需要使用Freemarker来实现这个功能。你可以使用JSP。 – Naiyer

+1

将您的模板放入/ templates/error /文件夹 – user482745

12

您正在使用Thymeleaf,而Thymeleaf可以在没有控制器的情况下处理错误。
对于这个thymeleaf页面需要被命名为error.html
并应在src/main/resources > templates > error.html

Thymleaf error.html

+0

您在error.html上编写的AnyCode将显示在浏览器中。 所有类型的错误将由error.html – GoutamS

+1

处理另外,确保Thymeleaf在类路径上。 –

1

放置如果你使用Thymeleaf象建议的问题,你可以使用类似于从一个模板以前的答复,但适合Thymeleaf而不是Freemarker。我还增加了引导的造型:

<!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模板目录。无需添加额外的控制器即可工作。

0

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