前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >必杀技:当报错信息看不出原因时,怎么办?

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

作者头像
程序猿Damon
发布2020-11-09 10:38:47
6960
发布2020-11-09 10:38:47
举报

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

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

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

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
[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 的依赖是可选的,如下:

代码语言:javascript
复制
<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 来进行判断启用,否则就会出现上面的问题。

欢迎大家关注个站

往期回顾

微服务自动化部署CI/CD

如何利用k8s拉取私有仓库镜像

个站建设基础教程

ArrayList、LinkedList&nbsp;你真的了解吗?

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

微服务架构设计之解耦合

浅谈负载均衡

Oauth2的认证实战-HA篇

Oauth2的授权码模式《上》

浅谈开发与研发之差异

浅谈&nbsp;Java&nbsp;集合&nbsp;|&nbsp;底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、MQ、ML、监控、大数据、k8s 等关键字可以查看更多关键字对应的文章。

点击 "damon8.cn" 获取更好的阅读体验!

代码语言:javascript
复制
❤️给个「在看」,是对我最大的支持❤
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 交个朋友之猿天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 往期回顾
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档