spring cloud+jfinal项目升级jfinal到4.9.02的问题

服务使用的是spring cloud整合jfinal(仅用到了ActiveRecord,kit包

jfinal原版本4.2,升级至4.9.02版本后使用HttpKit.post,出现java.io.InvalidClassException

java.lang.IllegalArgumentException: java.io.InvalidClassException: com.jfinal.kit.Kv; local class incompatible: stream classdesc serialVersionUID = 8574537963086834849, local class serialVersionUID = -6086130186405306902

经测试,升级至4.8能正常使用,4.9,4.9.01,4.9.02版本均出现上述问题

4.2~4.8之间的版本未测试

其他测试:

在Kv源码(版本4.9.02中添加serialVersionUID即可正常使用HttpKit.post

image.png

继续补充的测试:

服务外使用HttpKit.post(版本4.9+),访问服务(原4.2)接口,能正常返回

服务内使用HttpKit.post版本4.9.02),访问服务(升级到4.9.02)接口,不能正常返回

评论区

JFinal

2020-10-15 12:40

Kv 这个类添加过新的方法,从你的提问中看到应该是反序列化的时候出的问题

简单说就是序列化与反序列化使用了不同版本的 Kv,造成了这个异常,可以通过将 serialVersionUID 修改成一样的值来解决,也可以同时升级客户端与服务端的到 jfinal 4.9.02 来解决

还有一个办法是用 HashMap 代替 Kv 的使用

alldzz

2020-10-15 13:44

@JFinal 项目是聚合的,所有基础的jar包管理是在一个pom文件中,的确我在4.9+的版本中看到Kv是有变化的,另外一点HttpKit.post的参数我尝试换掉Kv,改为HashMap,但还是报出同样的异常了,测试中唯独增加serialVersionUID这个途径能够解决

JFinal

2020-10-15 13:58

@alldzz 统一 serialVersionUID 就能解决这个问题,是一个好办法,这个变量控制序列化与反序列化

alldzz

2020-10-15 15:16

@JFinal 谢谢波总,我已经找到问题了
该异常是由org.springframework.security.oauth2.common.util.SerializationUtils中的deserializeAccessToken方法将token反序列化,因为生成的token的过程中使用到了Kv对象,所以在反序列化后将会出现异常

解决方法:清除数据库中存储的token即可解决
使用mysql存储,需要清空oauth_access_token表和oauth_refresh_token表
使用redis存储,使用flushall清空缓存即可

其他想法或经验:在开发环境这样操作问题不大,如果是在生产环境,将用户登录的token数据直接清除是很不合理的。以上出现的问题是因为生成token的过程中使用到了Kv,所以需要在开发阶段避免。

其他:在使用HttpKit.post时,传参使用HashMap或者Kv都行,希望不要造成只能使用HashMap的误解。

这不是HttpKit.post的问题!!!

JFinal

2020-10-15 15:39

@alldzz 将缓存起来的 kv 值清掉,然后新进入的值都是新版本 kv 序列化以后的结果就可以解决

jfinal 这边可以为 Kv 添加 serialVersionUID,但添加这个东东代码稍稍难看点

alldzz

2020-10-15 16:05

@JFinal 如果能在jfinal中添加那就太好了,Kv是个很好用的map对象,我本人在项目的使用率就非常高,也很喜欢。
其实在JDK的源码中也能看到,基本上所有的数据对象都添加了serialVersionUID,我倒是不觉得代码丑陋,毕竟这样能够保证升级版本不会影响到数据的反序列化,希望波总采纳

JFinal

2020-10-15 16:57

@alldzz 已添加: https://gitee.com/jfinal/jfinal/commit/ae947ec9603cc97979259ff28befb37a2a7af63d

热门反馈

扫码入社