com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONObject报错处理

一.简介

项目A引用项目B的jar作为依赖,启动的时候也没问题,执行项目B中的一段代码的时候就报错了,代码如下:

Map<String, Object> map = Maps.newHashMap();
JSONObject jsonObject = (JSONObject)map.get("aaa");

报错代码是:

JSONObject jsonObject = (JSONObject)map.get("aaa");

报错提示:

com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONObject

JDK版本是8

FastJson的依赖为:

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.74</version>
            </dependency>

单独跑项目B,执行那段代码,发现又没有报错。
在项目A中target中也没有发现不同版本的FastJson。
很神奇。

二.排查

JDK8提示的错误就只有那句com.alibaba.fastjson.JSONObject cannot be cast to com.alibaba.fastjson.JSONObject
提示太少了。

后面切换JDK11,这时候看到更全面的报错信息了,错误信息如下:

class com.alibaba.fastjson.JSONObject cannot be cast to class com.alibaba.fastjson.JSONObject (com.alibaba.fastjson.JSONObject is in unnamed module of loader 'app'; com.alibaba.fastjson.JSONObject is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader 

发现是RestartClassLoader的问题,由spring-boot-devtools依赖引起的。

因为类的全名和路径都一样,那么根据java判断两个类是否是同一个类的2个原则:全名和类加载器,是由类加载器不同引起的。

Spring Boot 使用的自动重启技术涉及两个类加载器一个是 Baseclassloader ,用来加载不会变化的类,例如项目引用的第三方的 jar ;另一个是 Restartclassloader ,用来加载开发者自己写的会变化的类

在项目B中,FastJson是用Restartclassloader 加载的,所以不会报错,
在项目A中,由于引用了项目B的依赖,变成了项目A的FastJson用Restartclassloader 加载的,依赖的项目B 用Baseclassloader 加载。

三.解决

第一种.在pom.xml文件中去掉 spring-boot-devtools 依赖,这是因为类加载器不同导致的问题。

第二种.在 resources 目录下创建 META-INF 目录,在里面创建一个 spring-devtools.properties 文件, spring-devtools.properties 的内容如下:

restart.exclude.json=/com.alibaba.fastjson.*.jar

spring-devtools.properties 文件可以包含以restart.exclude 和restart.include 为前缀的属性。 include 属性会被“restart”类加载器加载,而 exclude 属性值会被“base”类加载器加载。该属性的值是应用于类路径的正则表达式模式

《肖申克的救赎》

生命可以归结为一种简单的选择:要么忙于生存,要么赶着去死。

懦怯囚禁人的灵魂,希望可以感受自由。强者自救,圣者渡人。

希望是件美丽的东西,也许是最好的东西。美好的东西是永远不会死的。

每个人都是自己的上帝。如果你自己都放弃自己了,还有谁会救你?

《熔炉》

我们一路奋战,不是为了能改变世界,而是为了不让世界改变我们。

现实如水母,看似美好无害实质总是致命伤人。

我们来到世界上,都是孤独的旅行,即使身边有人相伴,最终也会各奔东西!

世界上最美丽最珍贵的,反而是听不见且看不清的,只有用心才能感受得到。

《教父》

人可以不断犯错,但绝不能犯要命的错。

不要憎恨你的敌人,那会影响你的判断力。

人并非生来就伟大,而是越活越伟大。

《活着》

人是为了活着本身而活着,而不是为了活着之外的任何事物而活着。

以笑的方式哭,在死亡的伴随下活着。

没有什么比时间更具有说服力了,因为时间无需通知我们就可以改变一切。

你的命是爹娘给的,你不要命了也得先去问问他们。

《我不是药神》

世界上只有一种病,穷病,这种病你没法治,你也治不过来。

人间最高贵的是善良,是对生命的致敬。

《指环王》

把手握紧,里面什么也没有;把手放开,你得到的是一切。

我宁愿和你共度凡人短暂的一生,也不愿一个人看尽这世界的沧海桑田。

20.幸福的家庭都是相似的,不幸的家庭各有各的不幸。

或许有一天,人类变得萎缩懦弱,舍弃朋友,断绝友谊,但今天决不会这样。
《饮食男女》

22.人生不能像做菜,把所有的材料都准备好了才下锅。

什么叫做“可惜”啊,要心中有个“惜”字儿,才知道可惜。

其实一家人,住在一个屋檐下,照样可以各过各的日子,可是从心里产生的那种顾忌,才是一个家之所以为家的意义。

《让子弹飞》

世界上本没有路,有了腿便有了路。

如果你活着,早晚都会死;如果你死了,你就永远活着。

赚钱嘛,不寒碜

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘德华一不小心就打代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值