错误处理原理和定制错误页面

在这里插入图片描述
在这里插入图片描述
原理:
可以参照ErrorMvcAutoConfiguration;错误处理的自动配置; ErrorMvcAutoConfiguration给容器中添加了以下组件:
1.ErrorPageCustomizer:当系统发生4xx,或者5xx 异常的时候,ErrorPageCustomizer就会生效: 它能定制错误的响应规则。(像以前Servlet 在web.xml 中定制错误页面:哪个类型错误去到哪个页面…)。ErrorPageCustomizer 一旦生效,就会生成错误规则:默认是/error。那么就得有处理器来处理这个规则。
在这里插入图片描述
在这里插入图片描述

2、BasicErrorController:处理默认/error请求
在这里插入图片描述
在这里插入图片描述

BasicErrorController 是如何处理错误规则的呢?
produces = {“text/html”}:说明这个方法将产生html 数据,如果发送的数据请求头中有:Accept:text/html,则优先处理这个请求的数据。

除了浏览器请求,剩下就是其他客户端请求,那么这些请求就会交给另一个方法,这个方法返回JSON 数据:@ResponseBody

在这里插入图片描述

关于produces 属性:
@RequestMapping(value = “/produces”, produces = “application/json”):表示将功能处理方法将生产json格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/json”时即可匹配;

@RequestMapping(value = “/produces”, produces = “application/xml”):表示将功能处理方法将生产xml格式的数据,此时根据请求头中的Accept进行匹配,如请求头“Accept:application/xml”时即可匹配。

关于处理并返回html 数据的那个方法:
ModelAndView:包含页面地址和页面内容。去哪个页面作为错误页面就是封装在它里面
在这里插入图片描述
ModelAndView 又是怎么得到页面地址和页面内容 数据的呢?
通过ErrorViewResolver 异常解析器来拿到所有数据并封装到ModelAndView
在这里插入图片描述

ErrorViewResolver 又是怎么拿到数据的呢?
发现它就是一个接口,那么必然有实现类实现了它的方法
在这里插入图片描述

3.DefaultErrorViewResolver:ErrorViewResolver 的实现类
在这里插入图片描述

参数viewName 的值:HttpStatus 状态码的值
error/ + viewName = errorViewName .
比如我现在请求的页面状态码: 404
如果模板引擎能起作用:TemplateAvailabilityProvider provider = this.templateAvailabilityProviders.getProvider(errorViewName, this.applicationContext);
provider != null;
SpringBoot 会去找 error/404 。
在这里插入图片描述

如果模板引擎不起作用:
就在静态资源文件夹下找errorViewName对应的页面 error/404.html
在这里插入图片描述

我们的项目是引入了thymeleaf 模板引擎的,所以我们把error/404 页面放在templates 文件夹下:
在这里插入图片描述
这里的方法有点绕:大概意思是以4或者(5) 错误页面的文件名来匹配这种类型的所有错误。这样以4或者(5) 的状态码都能来到这个页面,精确优先(优先寻找精确的状态 码.html);比如现在出现404 状态码,error 下有404.html 和4xx.html,就会进入到404.html
在这里插入图片描述

在这里插入图片描述

在返回的错误页面上能拿到什么数据呢?
数据是从modelView 中的model 中获取的。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.DefaultErrorAttributes :是ErrorAttributes 的实现类。它的作用就是帮我们在页面共享信息。
在这里插入图片描述
DefaultErrorAttributes:这里类中就会在model 中存放很多的错误共享数据。还有很多方法没列出来,其中都是在做错误数据的存放。
在这里插入图片描述

页面能获取的信息; timestamp:时间戳 status:状态码 error:错误提示 exception:异常对象 message:异常消息 errors:JSR303数据校验的错误都在这里

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

2)、没有模板引擎(模板引擎找不到这个错误页面),静态资源文件夹下找;(既然模板引擎都无法找到这个文件,那么就不能使用模板引擎提供的语法拿出错误数据了。这个就当做了解)

3)、以上都没有错误页面,就是默认来到SpringBoot默认的错误提示页面;
在这里插入图片描述

定制错误的JSON 数据:
模拟一个异常抛出。
在这里插入图片描述当访问hello 请求时有可能会发生异常。
在这里插入图片描述

在这里插入图片描述
发现状态码是500,那么也可以搞一个5xx.html 页面放在error 下作为错误定制页面
在这里插入图片描述
在这里插入图片描述
用postman 响应的是SpringBoot 默认的json 数据,我们想定制json 错误返回数据。
在这里插入图片描述
这个错误就是通过Controller 的抛出的UserNotExistException,然后这里就捕获到了这个异常。
这种处理方式的缺点:没有自适应效果。只要是这个异常,统一返回JSON 数据。
在这里插入图片描述
我们来看下SpringBoot 是如何做自适应的:
通过request 的请求头的Accept 数据来定位用哪个Controller,然后通过对应的Controller 渲染出对应的错误数据。
在这里插入图片描述
但是我们从浏览器中发送错误请求:http://localhost:8080/hello?user=aaa。SpringBoot 还是没有给我们来到/error 下的页面。是因为我们没有给request 配置如下参数:
在这里插入图片描述这样就能实现:浏览器返回浏览器的错误页面,客户端返回的就是JSON 数据。
但是还没有做到定制JSON 错误数据。
在这里插入图片描述
当SpringBoot 出现错误以后,会到来/error 请求,会被BasicErrorController 处理,响应出去的数据是由map 进行封装的(页面:由map 交给model。客户端:直接map 存储)。而map 的数据是来自于getErrorAttributes()
在这里插入图片描述
getErrorAttributes() 是来自于AbstractErrorController.
在这里插入图片描述
AbstractErrorController 就是BasicErrorController 的父类。
在这里插入图片描述

在这里插入图片描述
既然我们知道了SpringBoot 就是通过BasicErrorController 来进行自定义响应效果,通过AbstractErrorController 来定义响应数据。那么我们就可以编写一个ErrorController 的实现类(或者编写AbstractErrorController 的子类),放在容器中。

或者更直接第一点:
页面上能用的数据,或者是json 返回能用的数据都是errorAttributes.getErrorAttributes() 得到的
在这里插入图片描述这个errorAttributes 也是在容器中的。
在这里插入图片描述

在这里插入图片描述当Controller 抛出UserNotExistException 异常,下面这个方法把数据放到map中,再把map 放到request 中。
在这里插入图片描述
把request 的数据放到getErrorAttributes() 中:
在这里插入图片描述

在这里插入图片描述

附上Controller:
在这里插入图片描述在进行客户端访问之前,先把登录拦截器给放行
不然客户端一直进不去

客户端访问:
在这里插入图片描述
浏览器访问:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值