Spring Boot 2.X 自定义错误页面
2023-09-11 14:22:55 时间
在项目中我们遇到404找不到的错误、或者500服务器错误,都需要配置相应的页面给用户一个友好的提示。
Spring Boot 2.X 为我们提供了下面 3 种方法实现这个功能。
实现 ErrorController 接口
在 Spring Boot 中,我们可以通过实现 ErrorController 接口,重写 handleError 方法,可以将错误重定向到预先放置在 static 目录下定义的静态 html 网页上。
@Controller
public class MyErrorController implements ErrorController {
private static final String ERROR = "/error";
private static final String ERROR_400 = "/400";
private static final String ERROR_500 = "/500";
@GetMapping(ERROR)
public String handleError(HttpServletRequest request) {
Enumeration<String> names = request.getAttributeNames();
System.out.println(Arrays.toString((Collections.list(names).toArray(new String[0]))));
Integer statusCode = (Integer)request.getAttribute("javax.servlet.error.status_code");
if(statusCode >= 400 && statusCode < 500) {
return ERROR_400;
} else {
return ERROR_500;
}
}
@Override
public String getErrorPath() {
return ERROR;
}
}
实现 ErrorPageRegistrar 接口
这个接口就有点麻烦了,需要对每种状态码进行配置。虽然可以将所有的状态码,都重定向到同一个页面,然后在 @Controller 中,再对它们做重定向,可还是很麻烦。
@Configuration
public class MyErrorRegistrar implements ErrorPageRegistrar {
private static final String ERROR_404 = "/400.html";
private static final String ERROR_500 = "/500.html";
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
System.out.println("ErrorPageRegistrar registerErrorPages");
ErrorPage[] errorPages = new ErrorPage[2];
errorPages[0] = new ErrorPage(HttpStatus.NOT_FOUND, ERROR_404);
errorPages[1] = new ErrorPage(HttpStatus.GATEWAY_TIMEOUT, ERROR_500);
registry.addErrorPages(errorPages);
}
}
配置嵌入式Servlet容器
ConfigurableWebServerFactory 用的也是 ErrorPage,跟之前一样
@Configuration
public class MyServerFactory {
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
private static final String ERROR_404 = "/400.html";
private static final String ERROR_500 = "/500.html";
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage[] errorPages = new ErrorPage[2];
errorPages[0] = new ErrorPage(HttpStatus.NOT_FOUND, ERROR_404);
errorPages[1] = new ErrorPage(HttpStatus.GATEWAY_TIMEOUT, ERROR_500);
factory.addErrorPages(errorPages);
factory.setPort(8080);
}
};
}
}
相关文章
- 面试(4)-spring-Spring面试题和答案
- RateLimiter:结合Spring Aop应用,以及SmoothBursty原理分析
- 《深入实践Spring Boot》一2.4 使用Neo4j
- Spring Boot(-)Spring Boot 是如何通过jar包启动的
- Spring开发 - 通过实现ApplicationContextAware在Servlet中调用注解的Service
- Spring MVC “404 Not Found”错误的解决
- Spring Boot 2.x基础教程:JSR-303实现请求参数校验
- Spring中ApplicationContextAware的用法
- Spring MVC 通过 @PropertySource和@Value 来读取配置文件
- Spring Boot 2.7.0发布,2.5停止维护,节奏太快了吧
- Spring Data JPA之动态查询
- spring框架漏洞整理(Spring WebFlow远程代码执行)
- spring框架漏洞整理(Spring Framework漏洞)
- 【Spring常见错误】Rocketmq 闪退
- 【Spring常见错误】java.lang.NoClassDefFoundError: redis/clients/jedis/UnifiedJedis
- 【Spring常见错误】idea添加@Data注解后无getter&setter提示
- 为什么说Java程序员到了必须掌握Spring Boot的时候?
- Web 之 Eclipse 搭建 Gradle 环境/并且运行 Gradle 工程(spring web)简单整理
- 【spring-bean】浅谈Spring的依赖注入(基础)
- Spring源码解析之:Spring Security启动细节和工作模式--转载