You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:39:22