当前位置: 首页 > 科技观察

Nirvana:报错信息没有显示原因怎么办?

时间:2023-03-12 14:00:11 科技观察

今天遇到了一个错误,一般的错误信息都会很明显,一看就知道是什么问题。说实话,我今天遇到的事情,真的很难找到原因。一般这种情况应该怎么解决呢?分享我的想法,不一定是最好的,至少有用。直接上图,下面是报错信息:为了方便查看,我提取了最重要的信息,如下:/WebAppConfigurer.class]:Invocationofinitmethodfailed;nestedexceptionisjava.lang.ArrayStoreException:sun.reflect.annotation。TypeNotPresentExceptionProxyjava.lang.ArrayStoreException这个平时确实很少遇到。看了源码,这是一个数组存储异常。比如下图中我框出来的部分就很清楚的说明了这个异常是在什么场景下发生的。也就是存储的时候类型不一致,然后报错!第二条需要注意的报错信息是WebAppConfigurer.class,比较清楚。它告诉我哪个班级有问题。然后看了下对应的代码,手动映射了资源路径。于是想是不是其中一个类的加载有问题。我直接把WebAppConfigurer去掉了,没用。后来报了同样的错误,不过是提醒了另外一个类,就是WebMvcAutoConfiguration。[org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]:Invocationofinitmethodfailed;nestedexceptionisjava.lang.ArrayStoreException:sun.reflect.annotation.TypeNotPresentExceptionProxy所以这就是为什么这些报错信息无法直接定位问题的原因。我们要注意的是java.lang.ArrayStoreException这个异常,只要找到这个异常发生的地方就可以解决了。接下来只能借助IDEA强大的调试功能,添加一个JavaExceptionBreakpoints。然后重启debug模式,果不其然,报错进入断点。现在终于找到原因了。parseClassValue时出现问题,Class为org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。这个类在我扩展Sentinel对FeigninSleuth的支持时修改过,没想到有bug。让我向你解释真正的原因。本扩展模块中sentinel的依赖是可选的,如下:>刚刚报错的项目中不需要Sentinel,但是使用了Sleuth和Feign,所以TraceFeignClientAutoConfiguration生效。最主要的是Conditional满足条件。项目没有显示指定的对Sentinel的依赖,这个类自然加载不了。所以解决方法就是要么添加Sentinel依赖,要么在@ConditionalOnClass中添加Sentinel类,这样只有当classpath中存在Sentinel类时才会加载。如果项目不依赖Sentinel,那么就不会加载,这样就没问题了。最后总结一下,主要是找出真正的问题出在哪里。有时异常信息不一定是真实的地方,而只是相关的。当你在你封装的模块中设置optional=true时,你还需要使用@ConditionalOnClass来判断并使对应的配置类加载生效,否则会出现上述问题。