今天遇到了一个错误,通常的错误提示会很明显,一看就知道是什么问题。今天遇到的这个说实话真的很差找缘由,通常在这种状况下该怎么解决呢?java
分享下个人思路吧,不必定是最好的,至少有用。web
直接上图吧,下面是报错信息:spring
为了方便查看,我把最重要的信息提取出来,以下:数组
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [com/cxytiandi/kitty/web/config/WebAppConfigurer.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
java.lang.ArrayStoreException这个确实平时不多遇到,看了下源码,这个是数组存储异常。好比下图中我框起来的部分就清楚的表示了在什么场景下会出现这个异常。app
也就是在存储的时候类型不一致,而后就报错了呗!spa
第二个须要关注的错误信息是WebAppConfigurer.class,这个还算挺明确的,告诉我哪一个类有问题,而后我看了下对应的代码,也就手动的映射了资源路径而已。debug
因而我就想,是否是这里面哪一个类加载的时候出问题了,我把WebAppConfigurer直接去掉了,可是并没什么用,后面仍是报的相同的错误,只不过是提示另外一个类了,就是WebMvcAutoConfiguration。调试
[org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
因此说这些错误信息没能直接定位问题就是这个缘由,咱们要关注的仍是java.lang.ArrayStoreException这个异常,只要找到这个异常发生的地方就能解决了。code
下面只能借助于IDEA强大的调试功能了,增长一个Java Exception Breakpoints了。blog
而后debug模式重启,果不其然就报错的时候就进断点了。
这下终于找到缘由了,parseClassValue的时候出问题了,Class就是 org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。
这个类是我当时在Sleuth中扩展Sentinel对Feign支持的时候作了一些修改,没想到竟然出了Bug。
下面给你们说明下真正的缘由吧,在这个扩展模块中sentinel的依赖是可选的,以下:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel</artifactId> <optional>true</optional> </dependency>
恰好报错的项目中不须要用到Sentinel,可是用到了Sleuth和Feign,因此TraceFeignClientAutoConfiguration生效了。主要仍是Conditional都知足条件了。
项目中又没显示指定依赖Sentinel,这个类天然加载失败。
因此解决办法就是要么加Sentinel依赖,要么就是在@ConditionalOnClass中加上Sentinel的类,这样只有当在Sentinel的类在classpath中存在的时候才会加载,若是项目没依赖Sentinel那么就不加载,这样就没问题了。
最后总结下吧,主要仍是要找到真正问题发生在什么地方,有的时候异常信息给出的并不必定是真正的地方,只是有关联而已。
当你封装的模块设置了optional=true的时候,在对应的配置类加载生效也须要用@ConditionalOnClass来进行判断启用,不然就会出现上面的问题。