最近 使用 fastjson 的时候发现一个问题,偶尔会报 类型转换异常 java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to XXX
,而报错的地方时使用 的 TypeReference
,泛型信息是传给 fastjson 的,并不是 XXX.class 也没有对返回值进行强转。
在网上搜了一些 fastjson 类型转换错误的文章,大部分是都是使用问题造成,最后发现了这篇文章《FastJson 泛型转换踩坑》,才基本确定是 fastjon 对泛型类反序列的一个Bug。
以下是复现 Bug 的代码,可以看出同样的代码,调用的顺序不一样,结果也会不一样。
fastjson 版本
1 | <dependency> |
辅助类
WebResult.java
1 | public class WebResult<T> { |
Person.java
1 | public class PersonVO { |
示例代码
1 | import com.alibaba.fastjson.JSON; |
Bug 修复版本
该 Bug 在 1.2.11
及其之前存在,在 1.2.12
及其之后已经修复
查看 Git 提交历史后发现,在 8f8540825c95a8cf22636799906d8864366c0658
这次提交之后进行修复,其上一次提交 8f8540825c95a8cf22636799906d8864366c0658
还有问题,修复的代码可点击此处
为什么会出现 ClassCastException
可以通过反编译看出来,编译后的代码 JDK 自动加上强制类型转换。
因为传入 fastjson 的类型信息与实际返回的类型信息不符,所以会类型转换错误。
编译前
1 | private static void error1() { |
编译后
1 | private static void error1() { |
解决方案
- 升级 fastjson 版本到 1.2.12+
- 所有使用反序列化泛型类的地方,必须传入泛型信息