fastjson报Caused by: java.lang.NoSuchFieldError: UTF8错误

最近几天一直在处理fastjson的UTF8报错,一直没有找到原因,花了几天潜心研究,终于解决。下面详细描述下我的解决方式和思路。

这个错的完整堆栈如下:

Caused by: java.lang.NoSuchFieldError: UTF8
at com.alibaba.fastjson.support.config.FastJsonConfig.(FastJsonConfig.java:86)
at com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter.(FastJsonHttpMessageConverter.java:73)
at com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter4.(FastJsonHttpMessageConverter4.java:18)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
... 47 more

这个问题出现的猝不及防,使用场景是这样的:这个工程跑在阿里云的一台机器上,一点问题都没有。新购了一台服务器,准备再跑一个同样的工程,结果一模一样的代码和环境,新购的服务器运行就报错。错误的原因如上所示。

看到这个出错的堆栈,分析的思路如下:

先确定原因,肯定是fastjson的依赖冲突了。

1、一开始就明确了具体的原因,接下去是分析过程,从堆栈看,并没有其他的依赖报错,所以无法定位到其他的依赖上;

2、那么使用mvn dependency:tree >> tree.txt 导出依赖关系分析,发现确实有几个jar也引用了fastjson,按照网上查到的方法exclusions排除一下编译,发现问题仍然未得到解决;

3、分析到这,其实已经没什么思路了,引用到fastjson的依赖都排除,仍然没有解决问题。解决过程中突然想到,是不是别的包不是以依赖的形式引入fastjson,而是以源码这种逆天的形似引入。这个思路瞬间打开了我的脑洞,直接源码里搜索FastJsonConfig这个类,发现友盟的统计API里有这个类,但是并没有fastjson的依赖;

4、至此,原因已经分析得出,这个jar直接编译了fastjson的源码。解决方法就很简单了,去友盟下载源码,去掉fastjson部分,以相同版本的依赖的形式集成,最后编译成本地jar集成,问题解决。

其实这个问题之所以让我耽搁了这么几天,主要还是一开始的分析思路出错了。没有按照出错堆栈分析。既然堆栈报类找不到,那么就搜这个类即可,一开始只要我搜索FastJsonConfig,肯定会出现好几个,看看每个类是哪个依赖带来的然后排除就好了。而不是总用网上的经验,什么更改fastjson版本啊、依赖排除啊。。这样即使问题解决了原因还是不知道。

所以出问题还是要冷静分析,这个有意思的问题的分析思路值得后续借鉴。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lindir

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值