这个是我的全局异常处理类,以new ThirdException(JSON.toJSONString(obj))形式抛出了这个自定义异常,不管从最底层的方法抛出上层不抛,还是从controller的入口开始都抛出,均无法精确匹配。下面分别是自定义异常和全局异常处理类,分析过程在末尾。
spring-boot-starter-parent版本:2.3.12.RELEASE
第一次调用 exceptionLookupCache 为空,会通过getMappedMethod方法获取后再进行put,exceptionLookupCache 是一个Map<Class<? extends Throwable>, Method>
类型的
ConcurrentReferenceHashMap 结构。
第2步,核心代码逻辑:从mappedMethods 中解析自定义异常和自定义异常的处理方法映射集合。mappedMethods 是类型为Map<Class<? extends Throwable>, 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)
感觉就像是代码问题,有什么解决方案吗?解决了有红包