部分情况下自定义HandlerExceptionResolver无效源码分析

起因

最近维护一个老项目,与前端对接的时候发现参数绑定失败,前端使用表单提交后台接收的是JSON格式,但重点是项目日志里面没有一点异常纪录。翻了一下项目配置,发现spring-mvc.xml里面配置的自定义HandlerExceptionResolver没有生效,此处纪录下最终原因。

因为Springmvc搭建有点繁琐,而Springboot得处理流程略有差异,所以没有debug截图,感兴趣得可以自己调一下,没什么逻辑。

org.springframework.web.servlet.DispatcherServlet#doDispatch 这个就不多说了,看下他的最终的异常处理
在这里插入图片描述找到这原因基本就确定了,但是按常理来说Resolver应该是有排序的,我们可以通过更改排序来体过自定义Resovler优先级,继续翻一下这个集合初始化代码。这方法应都很熟悉,九大组件之一。
在这里插入图片描述
在这里插在这里插入图片描述入图片描述
如上图,springmvc项目会自带2处标记的两个默认异常处理,此处有个小坑,单从类属性而言并没有直接修改Ordered的方式,这两个类理论上应该使用的是父类的优先级,但实际debug的结果一个是0一个是1.

后来百度了一下,这两个类是默认异常处理,触发点在spring-mvc.xml解析处。 就是spring的NameSpaceHandler相关的加载套路,通过xml的名称空间去META-INF下找spring.handlers文件,然后加载相关NameSpaceHandler,再初始化标签解析类。 默认的Resovler就是在此时进行加载和定义优先级。
在这里插入图片描述
在这里插入图片描述

问题二:DefaultHandlerExceptionResolver会拦截哪些异常,为什么业务异常它没有进行拦截

  • 在这里插入图片描述
    调用链大致为org.springframework.web.servlet.DispatcherServlet#processHandlerException—>org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver#resolveException---->org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver#doResolveException
    模板模式,最后一层由其子类实现,此处为DefaultHandlerExceptionResolver。

问题三:为什么将自定义exceptionResovler改@ExceptionHandler(Exception.class)就可以拦截到

  • 使用@ExceptionHandler注解有两种方式,1.使用ControllerAdvice标注一个类,在类中得方法上使用该注解。2.写在当前类中一个方法上
    1. 上面提到的ExceptionHandlerExceptionResolver 是springmvc自动加载的类,该类初始化时会进行 @ControllerAdvice注解的解析,获取内部异常处理的方法,然后放入缓存。在这里插入图片描述在这里插入图片描述在这里插入图片描述
  • 无特殊配置的情况下,ExceptionHandlerExceptionResolver 的优先级最高,所以可以处理所有@ExceptionHandler匹配到的异常

以上仅为个人分析,有不对的地方欢迎指正交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值