1. 出现错误时页面效果
1. 浏览器发送一个不存在的请求时,会报404
2. 服务器内部发生错误的时候,页面会返回什么呢?(500)
3. 通过上面,我们会发现无论是发生什么错误,SpringBoot 都会返回一个状态码以及一个错误页面,这个错误页面是怎么来的呢?(我看不懂)
- 分析底层原理分析
- ErrorPageCustomizer 错误页面定制器
当应用出现了4xx或5xx之类的错误 ,ErrorPageCustomizer就会被激活,它主要 用于定制错误 处理的响应规则,
就会发送一个/error请求,它会交给 BasicErrorController进行处理
- BasicErrorController 就会接收 /error 请求处理。
BasicErrorController 会接收一个/error请求, 两个 方法处理,第1个erroHtml响应html数据, 还有一个error用
来响应json数据 的, 使用了 ErrorViewResolver (DefaultErrorViewResolver)组件进行封装视图
- DefaultErrorViewResolver 去解析具体响应的错误页面。(下面是部分代码)
通过以上分析则可以自定义错误页面
- DefaultErrorAttributes 错误页面可获取到的数据信息
通过 BasicErrorController 的方法中响应的 module 可定位到响应哪些数据,从而引出 ErrorAttributes 的实
现类 DefaultErrorAttributes , DefaultErrorAttributes 中绑定的所有值都可在页面获取到。
总结:
- 每次出现错误之后,它会自动在我们的文件夹中寻找是否定义了相应的错误文件,这个时候templates文件夹中有相应文件它会优先;
- 有两种选择方式,一种精确匹配(500.xml),一种模糊匹配(5xx.xml),这个时候它会准确匹配优先;
- 我们还可以获取错误中的一些其他信息,我们可以通过 thymeleaf 的语法进行获取(具体如下 4. )
4. 下面省略一大波可获取的数据
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验出现的错误
2. 自定义错误响应页面
1. 第1种 :有模板引擎
error/状态码 : 精确匹配,将错误页面命名为 错误状态码.html 放在模板引擎目录 templates 下
的 error 目录下,发生对应状态码错误时,就会响应对应的模板页面
error/4xx 、error/5xx :模糊匹配, 可以将错误页面命名为 4xx 和 5xx ,有来匹配对应类型的
所有错误
采用精确优先
错误页面可获取的的数据信息
timestamp:时间戳
status:状态码
error:错误提示
exception:异常对象
message:异常消息
errors:JSR303数据校验出现的错误
2. 第2种:没有模板引擎 (模板引擎找不到对应错误页面)
静态资源目录下的 error 目录中找
3. 第3种: 模板目录与静态目录下都找不到对应错误页面,就响应 SpringBoot 默认的错误页面
通过 BasicErrorController 的 errorhtml 方法最后 一行可知,没有找到则找 error 视图对象 ,error定义
在 ErrorMvcAutoConfiguration 的 defaultErrorView 中
3. 自定义数据进行响应
1.分析
出现错误以后,会发送 /error 请求,会被 BasicErrorController 处理,而响应的数据是由
getErrorAttributes 封装的(就是 ErrorController 的实现类 AbstractErrorController.getErrorAttributes 的方法),
所以我们只需要自定义 ErrorAttributes 实现类即可
2. 自定义 ErrorAttributes(这个定义的是只要有异常,就能获取这个我们自定义的错误信息)
3. 错误页面获取(404和500都可以获取,当然我们这里也定义了500的错误页面)