部分情况下自定义HandlerExceptionResolver无效

起因

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

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

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

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

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

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