Spring Cache Redis使用Jackson序列化时遇到的问题

问题描述:

升级jdk17和springboot3.0时:jackson版本2.14.2

业务使用sonar扫描问题发现异味:stream表达式toList()统一替换了collect(Collectors.toList())

发现redis里保存列表数据时,“java.util.List”集合类型丢失,报错com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected VALUE_STRING: need JSON String, Number of Boolean that contains type id (for subtype of java.lang.Object)

探索过程:

使用github的jackson-databind中issue和其他搜索(bing,baidu,stackoverflow),代码测试,发现是toList()导致的问题,由于toList()生成的是UnmodifiableList,jackson在不使用ObjectMapper.DefaultTyping.EVERYTHING这个配置时会把UnmodifiableList当成Array处理,官方说jdk17已经修复了,然而我测试发现其实并没有,而且在redis官方的写法中GenericJackson2JsonRedisSerializer也使用了EVERYTHING作为序列化配置。

解决方案:

1.把toList改回去,因为如果不改,序列化回去的结果还是不可变的,导致修改这个缓存数据还是会报错,而且对于这种需要序列化的数据使用不变列表并没有意义,可以参见下方stackoverflow链接的说法

2.维持EVERYTHING的写法,与redis官方写法保持一致

附录:

附上spring cache 使用redis配置时的cachemanager,包含对序列化反序列化的配置和对localDateTime等类型处理(引入jackson-jsr310)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值