问题描述:
升级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)

最低0.47元/天 解锁文章
2654

被折叠的 条评论
为什么被折叠?



