使用Spring Boot构建的WEB应用可以很方便的打成jar包发布,也可以打成war包发布到应用服务器中。自定义错误页面在这两种发布方式下是不一样的。
jar包中自定义错误页面
创建Spring Boot项目,默认打包方式是jar,内部使用内嵌tomcat等servlet容器
最简单的方式是直接在resources/templates目录下创建error.html页面,此时如果访问不存在的画面就会直接进入此画面。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
sorry, system exception
</body>
</html>
第二种方式是实现ErrorPageRegistrar接口,定义具体异常的URL路径:
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.boot.web.servlet.ErrorPageRegistrar;
import org.springframework.boot.web.servlet.ErrorPageRegistry;
import org.springframework.http.HttpStatus;
public class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
ErrorPage page404 = new ErrorPage(HttpStatus.NOT_FOUND, "/404");
ErrorPage page500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500");
errorPageRegistry.addErrorPages(page404, page500);
}
}
然后在一个配置类中声明该Bean:
@Bean
public ErrorPageRegistrar errorPageRegistrar(){
return new MyErrorPageRegistrar();
}
在Controller中添加404和500:
/**
* 404 error
* @return
*/
@RequestMapping("/404")
public String error404() {
return "commons/404";
}
/**
* 500 error
* @return
*/
@RequestMapping("/500")
public String error500() {
return "commons/500";
}
在resources/templaes/commons目录下创建404.html和500.html下即可。
war包中自定义错误页面
Spring Boot打成war包发布到tomcat中,首先需要配置如下:
- 将Spring Boot入口类继承 org.springframework.boot.web.support.SpringBootServletInitializer 类
@SpringBootApplication
@EnableTransactionManagement
public class HelloApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(HelloApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class, args);
}
}
-
pom.xml中的packaging设置成war
<packaging>war</packaging>
-
pom.xml中添加属性start-class,设置为Spring Boot入口类
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <thymeleaf.version>3.0.2.RELEASE</thymeleaf.version> <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version> <start-class>com.feng.hello.HelloApplication</start-class> </properties>
-
pom.xml中将tomcat的依赖的scope设置成provided
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
此时打包后生成的war包可以发布到tomcat中了,但是404等错误画面默认是 Whitelable Error page ,这种方式明显不够友好,通过如下步骤自定义错误画面:
-
首先禁用Whitelabel error page, application.properties中添加
server.error.whitelabel.enabled=false
-
定义error.html, 404.html, 500.html等错误画面
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <head th:include="fragments/header :: header"/> <script type="text/javascript"> function toIndex(){ window.location.href = ctx + "/index"; } </script> </head> <body class="body-bg w100"> <div class="Center" style="height: 100%;"> <div class="Container"> <div class="Container-1" style="height: 100%;"> <div class="Content bg" style="text-align: center;"> <h1>Sorry, page not found</h1> <a onclick="toIndex()">Go Home</a> </div> </div> </div> </div> </body> </html>
-
创建Controller实现 org.springframework.boot.autoconfigure.web.ErrorController 接口
@Controller public class AppErrorController implements ErrorController { @Override public String getErrorPath() { return "/error"; } @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 "commons/404"; } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { return "commons/500"; } } return "commons/error"; } }
此时如果访问不存在的画面就会显示我们自定义的画面。
版本说明:
- Spring Boot 1.5.4.RELEASE
- Thymeleaf 3.0.2.RELEASE
参考:
https://www.mkyong.com/spring-boot/spring-boot-deploy-war-file-to-tomcat/