6. springboot-----默认的错误处理机制




1. 出现错误时页面效果

1. 浏览器发送一个不存在的请求时,会报404

在这里插入图片描述



2. 服务器内部发生错误的时候,页面会返回什么呢?(500)

在这里插入图片描述

在这里插入图片描述



3. 通过上面,我们会发现无论是发生什么错误,SpringBoot 都会返回一个状态码以及一个错误页面,这个错误页面是怎么来的呢?(我看不懂)

  • 分析底层原理分析
  1. ErrorPageCustomizer 错误页面定制器
    在这里插入图片描述
    当应用出现了4xx或5xx之类的错误 ,ErrorPageCustomizer就会被激活,它主要 用于定制错误 处理的响应规则,
    就会发送一个/error请求,它会交给 BasicErrorController进行处理

  1. BasicErrorController 就会接收 /error 请求处理。
    在这里插入图片描述
    BasicErrorController 会接收一个/error请求, 两个 方法处理,第1个erroHtml响应html数据, 还有一个error用
    来响应json数据 的, 使用了 ErrorViewResolver (DefaultErrorViewResolver)组件进行封装视图

  1. DefaultErrorViewResolver 去解析具体响应的错误页面。(下面是部分代码)
    在这里插入图片描述
    通过以上分析则可以自定义错误页面

  1. DefaultErrorAttributes 错误页面可获取到的数据信息
    在这里插入图片描述
    通过 BasicErrorController 的方法中响应的 module 可定位到响应哪些数据,从而引出 ErrorAttributes 的实
    现类 DefaultErrorAttributes , DefaultErrorAttributes 中绑定的所有值都可在页面获取到。

总结:

  1. 每次出现错误之后,它会自动在我们的文件夹中寻找是否定义了相应的错误文件,这个时候templates文件夹中有相应文件它会优先;
  2. 有两种选择方式,一种精确匹配(500.xml),一种模糊匹配(5xx.xml),这个时候它会准确匹配优先;
  3. 我们还可以获取错误中的一些其他信息,我们可以通过 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的错误页面)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_36354011/article/details/86760956