bru*_*oid 29 java spring spring-mvc thymeleaf spring-boot
在我的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"));
}
};
}
Run Code Online (Sandbox Code Playgroud)
另外,我创建了以下简单的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>
Run Code Online (Sandbox Code Playgroud)
并将其添加到/resources/templates/文件夹中.就在404错误我只能看到白屏.
我做错了什么以及如何正确设置我的404页面?此外,是否可以使用模板而不仅仅是自定义错误页面的静态页面?
bru*_*oid 50
在Spring Boot 1.4.x中,您可以添加自定义错误页面:
如果要为给定的状态代码显示自定义HTML错误页面,请将文件添加到文件
/error夹.错误页面可以是静态HTML(即添加到任何静态资源文件夹下),也可以使用模板构建.文件名应该是确切的状态代码或系列掩码.例如,要将404映射到静态HTML文件,您的文件夹结构将如下所示:
Run Code Online (Sandbox Code Playgroud)src/ +- main/ +- java/ | + <source code> +- resources/ +- public/ +- error/ | +- 404.html +- <other public assets>
Gou*_*amS 27
你正在使用Thymeleaf,Thymeleaf可以在没有控制器的情况下处理错误.
对于一般错误页面,此Thymeleaf页面需要命名为,error.html
并且应放在其下src/main/resources > templates > 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";
}
}
Run Code Online (Sandbox Code Playgroud)
你也可以用View Controller替换这些只查看渲染器的控制器:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/404.html").setViewName("404");
}
}
Run Code Online (Sandbox Code Playgroud)
此外,是否可以将模板而不仅仅是静态页面用于自定义错误页面?
是的,这是可能的。但是 Not Found 页面通常是静态的,使用模板而不是普通的旧 HTML没有多大意义。
小智 5
不需要EmbeddedServletContainerCustomizer豆子。只需将相应的错误页面(例如 404.html 的 404)放在公共目录中就足够了(如@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>
Run Code Online (Sandbox Code Playgroud)
这将显示正确的错误状态和相应的错误消息。由于您使用的是 Spring Boot,您可以随时覆盖显示在错误页面上的状态和错误消息。
如果您按照问题中的建议使用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>
Run Code Online (Sandbox Code Playgroud)
您应该将此代码放在一个名为的文件中error.html,并将其放在您的thymeleaf模板目录中。无需添加其他控制器即可工作。
检查类路径中是否存在 thymeleaf,或添加以下代码并重新导入项目。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67177 次 |
| 最近记录: |