(ruoyi-vue)字典报错com.alibaba.fastjson2.JSONException: class java.lang.String cannot be converted to...

一个及其“怪异”的bug,值得一提的是,每次出现报错只要重启一下项目就可以了,但是每次当你觉得这个bug已经消失的时候,他又会跑出来ex你。(项目采用的是ruoyi-vue框架)

下面是具体报错信息:

com.alibaba.fastjson2.JSONException: class java.lang.String cannot be converted to class com.ruoyi.common.core.domain.entity.SysDictData
	at com.alibaba.fastjson2.JSONArray.toList(JSONArray.java:1010)
	at com.ruoyi.common.utils.DictUtils.getDictCache(DictUtils.java:45)
	at com.ruoyi.system.service.impl.SysDictTypeServiceImpl.selectDictDataByType(SysDictTypeServiceImpl.java:76)
	at com.ruoyi.system.service.impl.SysDictTypeServiceImpl$$FastClassBySpringCGLIB$$b80fef4d.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386)
	at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:704)
	at com.ruoyi.system.service.impl.SysDictTypeServiceImpl$$EnhancerBySpringCGLIB$$5ef9dbb1.selectDictDataByType(<generated>)
	at com.ruoyi.web.controller.system.SysDictDataController.dictType(SysDictDataController.java:78)
	at com.ruoyi.web.controller.system.SysDictDataController$$FastClassBySpringCGLIB$$bbda843.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
	at com.ruoyi.web.controller.system.SysDictDataController$$EnhancerBySpringCGLIB$$d6228984.dictType(<generated>)
	at sun.reflect.GeneratedMethodAccessor194.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

报错信息中可以发现首先这是一个由fastjson2引发的bug,在查阅相关资料和博客之后,了解到可能是由于fastjson2版本导致的问题,于是便更换了几次版本,结果却不尽人意,显然这个bug和fastjson2的版本关系不是很大,还有一种说法是浏览器版本过低导致的,这种说法我没有去尝试,大家有空的话可以去尝试一下这个解决方案。

于是我继续从报错信息中查找线索,定位到报错信息的第二行发现,这个bug是由fastjson2中的JSONArray这个类的toList()方法导致的。到这里就有了大致的方向了,于是继续向下定位到这个错误具体出现在项目中的common.utils包下的Dictutils中的getDictCache()这个方法。

快速找到这个方法:

果然这里面有个JSONArray的toList()方法,非常好,现在错误根源找到了,那么现在该如何解决这个错误呢?给大家两个解决方案,PlanB可以解决问题,但是不推荐大家使用,因为没能从源头解决问题。

PlanA:

使用fastjson替代fastjson2

List <Entity> entityList = JSONArray.toList (array, new Entity (), new JsonConfig ())

该方法可以实现json数组向List的转换,并且个人感觉fastjson比fastjson2要稳定一点,所以比较推荐大家使用。

PlanB:

 这个方法目的是获取redis中字典的缓存,当然,如果项目的字典数据不是特别大,那么是不是就可以关闭使用该缓存信息?我们查看一下这个方法的调用者:

 

 所以PlanB就是在查询字典的信息时不采用缓存数据,将相关代码注释掉即可。

 由于这是我的第一篇博客,所以有什么写得不好的地方,或者是有什么不同见解的地方还希望各位吴彦祖多多包涵。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值