Spring Boot中Redis缓存加载时List映射异常的解决方法
问题解决:Spring Boot Redis缓存反序列化类型转换异常
问题根源
报错显示LinkedHashMap["id"]无法转换为目标类型,核心原因是序列化Redis缓存时未保存对象类型信息,Jackson反序列化时默认将JSON转为LinkedHashMap,但接口返回要求的是List<PrivateRecipeData>,因此触发类型转换异常。
解决步骤
1. 修改Jackson配置,启用类型信息
在RedisConfig的redisMapper()方法中,添加类型信息序列化配置(替换原有的ObjectMapper初始化代码):
private fun redisMapper(): ObjectMapper { return ObjectMapper() // 为非final类添加@class字段存储全类名,用于反序列化识别类型 .activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY ) .setSerializationInclusion(JsonInclude.Include.NON_EMPTY) }
注:旧版Jackson的
enableDefaultTyping已被废弃,推荐使用activateDefaultTyping以兼容新版本依赖。
2. 清理Redis中的旧缓存
之前写入的缓存没有类型信息,必须手动删除Redis中privateRecipes相关的缓存键,避免读取旧缓存导致异常。
3. 重启服务验证
重启Spring Boot服务后,首次请求会重新写入带类型信息的缓存到Redis,第二次读取时Jackson会根据@class字段将JSON正确反序列化为List<PrivateRecipeData>,接口即可正常返回。
简化配置方案(可选)
如果使用较新版本的Spring Data Redis,可直接使用GenericJackson2JsonRedisSerializer的默认构造函数(内部已默认启用类型信息),简化配置:
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(GenericJackson2JsonRedisSerializer()))
这种情况下可以删除自定义的redisMapper()方法,效果一致。
内容的提问来源于stack exchange,提问作者finisinfinitatis
相关产品推荐
相关产品推荐

