一、SpringBoot默认的错误处理机制
默认有两种:①浏览器的访问(响应html页面);②其他客户端的访问(响应json数据)。
为什么要区分为两种呢?因为发送的请求头不同,响应数据也不同。浏览器发发送请求:text/html;其他客户端发送请求:*/*
1、浏览器,返回一个默认的错误页面。(响应页面)
2、其他客户端(如Postman的模拟)。响应一个json数据
二、SpringBoot默认的错误处理机制 的原理
1、源码参考:spring-boot-autoconfigure-2.3.4.RELEASE.jar!\org\springframework\boot\autoconfigure\web\servlet\error\ErrorMvcAutoConfiguration.java 错误处理的自动配置
2、具体来看 ErrorMvcAutoConfiguration类,给容器中添加了以下重要的组件:
- DefaultErrorAttributes:获取错误信息
- BasicErrorController:处理默认/error请求
同样的/error请求,根据请求头的不同,会有两种处理方式:
1)、浏览器请求头:text/html,产生html类型的数据
2)、其他客户端,产生json数据 - ErrorPageCustomizer:定制错误的响应规则(错误经ErrorPageCustomizer处理后,来到/error请求)
- DefaultErrorViewResolver:解析页面响应地址
- 自动配置的步骤:
1)一旦系统出现4xx或5xx之类的错误,3.ErrorPageCustomizer就会生效,来到/error请求,接着就会被2.BasicErrorController处理。
2)BasicErrorController有两种处理方式。
3)这里先说对浏览器的处理(响应页面)。通过ModelAndView
使用4.DefaultErrorViewResolver来具体实现。先去模板引擎templates目录下看有无error/状态码.html文件,有则响应该页面,无则再去静态资源文件夹static下看有无error/状态码.html文件,有则响应该页面,无则使用Spring Boot默认提供的错误提示页面。
三、定制错误响应
1、定制错误响应页面
- ①有模板引擎时,自动在模板引擎路径下查找error/状态码.html页面。即可跳转到我们自己定制的错误页面。可以使用404等精准匹配错误,也可使用4xx和5xx来模糊匹配所有错误。以精准匹配优先。
页面可以获取的信息:
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验的错误都在这里 - ②没有模板引擎时,或者在模板引擎下找不到这个错误页面,也可到静态资源文件夹下找到error页面,但也能无法获取timestamp等信息
- ③上面都没有时,默认使用Spring Boot提供的错误提示页面
2、定制错误响应数据 --多为json数据
使用 @ResponseBody 可以返回json对象,但是没有自适应效果,不能实现返回页面。
将请求转发给/error后,Spring Boot会自动帮我们实现自适应两种效果。
3、将我们定制的数据 返回给页面或返回json数据
从上面我们可以知道发生错误后,ErrorPageCustomizer就会生效,来到/error请求,接着就会被BasicErrorController处理。BasicErrorController是怎么处理的呢,通过getErrorAttributes(..)方法,该方法对象的类实现了ErrorController接口。所以
实现方法之一是:我们需要重新编写自己的类来实现ErrorController接口,即可定制自己的数据。--需要重新的太多了,放弃
实现方法二:页面上所有能得到的数据都是通过DefaultErrorAttributes类的getErrorAttributes(..)方法得到的,所以我们只需要:在容器中加入我们自己定义的ErrorAttributes即可。
效果: