必杀技:当报错信息看不出原因时,怎么办?

项目地址

https://github.com/yinjihuan/kitty-cloud [1]

今天遇到了一个错误,一般的错误提示会很明显,一看就知道是什么问题。今天遇到的这个说实话真的不好找原因,一般在这种情况下该怎么解决呢?

分享下我的思路吧,不一定是最好的,至少有用。

直接上图吧,下面是报错信息:

必杀技:当报错信息看不出原因时,怎么办?

为了方便查看,我把最重要的信息提取出来,如下:

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 这个确实平时很少遇到,看了下源码,这个是数组存储异常。比如下图中我框起来的部分就清楚的表示了在什么场景下会出现这个异常。

必杀技:当报错信息看不出原因时,怎么办?

也就是在存储的时候类型不一致,然后就报错了呗!

第二个需要关注的错误信息是 WebAppConfigurer.class,这个还算挺明确的,告诉我哪个类有问题,然后我看了下对应的代码,也就手动的映射了资源路径而已。

必杀技:当报错信息看不出原因时,怎么办?

于是我就想,是不是这里面哪个类加载的时候出问题了,我把 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 这个异常,只要找到这个异常发生的地方就能解决了。

下面只能借助于 IDEA 强大的调试功能了,增加一个 Java Exception Breakpoints 了。

必杀技:当报错信息看不出原因时,怎么办?

然后 debug 模式重启,果不其然就报错的时候就进断点了。

必杀技:当报错信息看不出原因时,怎么办?
必杀技:当报错信息看不出原因时,怎么办?

这下终于找到原因了,parseClassValue 的时候出问题了,Class 就是 org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。

这个类是我当时在 Sleuth 中扩展 Sentinel 对 Feign 支持的时候做了一些修改,没想到居然出了 Bug。

扩展原文链接: 当Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth会擦出怎样的火花

下面给大家说明下真正的原因吧,在这个扩展模块中 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 来进行判断启用,否则就会出现上面的问题。

关于作者 :尹吉欢,简单的技术爱好者,《Spring Cloud 微服务-全栈技术与案例解析》, 《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号  猿天地  发起人。个人微信  jihuan900 , 欢迎勾搭。

相关推荐

  • 双剑合璧的开源项目Kitty-Cloud

  • Kitty-Cloud环境准备

  • Kitty-Cloud服务搭建过程剖析

后台回复 学习资料   领取学习视频

必杀技:当报错信息看不出原因时,怎么办?

如有收获,点个在看,诚挚感谢

原文 

http://mp.weixin.qq.com/s?__biz=MzIwMDY0Nzk2Mw==&mid=2650321297&idx=1&sn=52f33ddb33e9b8c1c6114842a57c26c6

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 必杀技:当报错信息看不出原因时,怎么办?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址