本文资源:
- github code demo:https://github.com/codedemo-club/spring-boot-custom-error-page
- 同步视频:https://www.bilibili.com/video/BV1Hv411v7KL/
- 原文地址:https://www.baeldung.com/spring-boot-custom-error-page
在正式开始前,可以点击以下链接获取一份与本文相同的初始化代码。
1. 概述
本文将介绍如何禁用以及自定义Spring Boot的默认错误页面。
2. 禁用错误页
可以简单的通过设置以下配置项来达到禁用错误页的目的:
server.error.whitelabel.enabled=false
此时若发生错误则将显示其servlet的错误信息,比如将显示Tomcat的错误页面。
除上述方法外,还可以通过排除ErrorMvcAutoConfiguration bean的方法来达到同样的效果:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration
除上述两种方法外,也可以在系统启动类上加入以下注解:
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class})
3. 显示自定义错误页面
在开始自定义错误页面以前,首先确认当前项目加入了Thymeleaf 模拟引擎。在此基础上,新建如下 error.html 模板:
<!DOCTYPE html> <html> <body> <h1>Something went wrong! </h1> <h2>Our Engineers are on it</h2> <a href="/">Go Home</a> </body> </html>
注意:Thymeleaf 默认的模板位于 resources/templates 目录。该目录下的 error.html 模板将会自动被 Spring Boot 中的BasicErrorController 识别并应用。此时一旦发生错误,Spring Boot将会渲染 error.html 并显示在浏览器上。
除此以外Spring Boot还支持按错语的状态码来自定义错误信息,比如我们想定义发生404错语的信息,则可以在resources/templates/error 中新建404.html文件。
此时,若发生404错误,Spring Boot将渲染404.html.
3.1 自定义错误控制器
仅仅通过自定义错误模板的方法还远远不错。比如:我们想在错误发生时显示更多、更人性的信息;记录发生错误时用户请求信息;在404页面中进行热门商品的推送等。
这时候就需要一个自定义错语控制器:
@Controller public class CustomErrorController implements ErrorController { @RequestMapping("/error") public String handleError() { System.out.println("hello"); // 进行一些逻辑处理,比如记错报错时的请求地址、请求参数、登录用户等 return "error"; } @Override public String getErrorPath() { return null; } }
如上所示,使用实现ErrorController接口的方法来标识此类为 自定义错误控制器。当发生错误时handleError()将被触发,返回值对应 Thymeleaf 的相应模板,此时可以通过修改error.html以达到自定义提示信息的目的。不仅如此,我们还可以在C层中进行一些逻辑处理,或将一些希望显示在错误错误的信息由C层组装并在模板中渲染。
以下我们演示一下如果简单地对handleError() 进行升级,以使其能够在发生不同的错误时显示不同的错误信息。
@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()) { // 发生404错误时,渲染error-404模板 return "error-404"; } else if(statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { // 发生500错误时,渲染error-500模板 return "error-500"; } } // 未获取到错误类型时,渲染error模板 return "error"; }
此时当发生404错语时,将为用户展示error-404.html模板;当发生500错误,将为用户展示error-500.html模板。
4. 总结
本文展示了几种自定制错误页面的方法,在此方法的基础上当系统发生相应的错误时,可以展示更加友好的提示信息。