SpringBoot全局异常@ExceptionHandler无法精确匹配问题分析


这个是我的全局异常处理类,以new ThirdException(JSON.toJSONString(obj))形式抛出了这个自定义异常,不管从最底层的方法抛出上层不抛,还是从controller的入口开始都抛出,均无法精确匹配。下面分别是自定义异常和全局异常处理类,分析过程在末尾。

spring-boot-starter-parent版本:2.3.12.RELEASE




第一次调用 exceptionLookupCache 为空,会通过getMappedMethod方法获取后再进行put,exceptionLookupCache 是一个Map, Method>

类型的ConcurrentReferenceHashMap 结构。




第2步,核心代码逻辑:从mappedMethods 中解析自定义异常和自定义异常的处理方法映射集合。mappedMethods 是类型为Map, Method>的HashMap结构在服务启动的时候通过init***方法加进去。有异常抛出时通过mappedException.isAssignableFrom这个native方法判断mappedMethods的keys,keys就是在全局异常中定义的所有异常类,包括自定义异常。



第3步:***.common.basic.exception.ThirdException 在通过 isAssignableFrom 判断时返回了false,所以没有加到 matches 里面,也就没有机会参加排序,就导致没有匹配到准确的处理方法。

启动的时候mappedMethods 里面可以正常加进去,但是isAssignableFrom 判断时返回了false,随后调用的时候mappedMethods 就为空了,这很正常,因为它就是个reference的ConcurrentHashMap。但导致exceptionLookupCache 会加进去一个ThirdException->null 的kv,结果就是找不到ThirdException对应的处理方法,进而直接走了@ExceptionHandler(value = Exception.class)

感觉就像是代码问题,有什么解决方案吗?解决了有红包

展开阅读全文

页面更新:2024-04-02

标签:全局   精确   异常   末尾   红包   逻辑   类型   结构   代码   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top