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

SpringBoot集成Redis如何实现Java对象与JSON互转并直接返回实体对象

问题根因

当前配置的Jackson2JsonRedisSerializer未存储序列化时的对象类型信息,反序列化时无法识别要映射的具体实体类,默认将JSON对象结构转换为LinkedHashMap。你初始化序列化器时传入的泛型为Object.class,Jackson没有足够的信息判定目标转换类型,就会使用默认的集合类型承接数据。

解决方法

修改RedisTemplate配置,给ObjectMapper开启默认类型序列化,让JSON中额外存储类的全限定名信息,反序列化时就会自动映射回原实体类:

@Configuration
public class RedisTemplateConfiguration {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 新增这行配置,开启默认类型序列化
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, 
                ObjectMapper.DefaultTyping.NON_FINAL, 
                JsonTypeInfo.As.PROPERTY);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 设置key和value的序列化规则
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

        // 设置hashKey和hashValue的序列化规则
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

简化方案

你也可以直接使用Spring内置封装好的GenericJackson2JsonRedisSerializer替换自己手动配置的Jackson2JsonRedisSerializer,该序列化器已经默认配置好了类型序列化逻辑,无需手动调整ObjectMapper:

// 直接替换掉原来的Jackson2JsonRedisSerializer配置部分
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
注意事项

修改配置前已经存入Redis的旧数据因为没有类型标识,修改配置后读取会报错,需要删除旧数据后重新写入,新写入的数据就会自动携带类型信息,读取时直接强转为对应实体类即可。

内容的提问来源于stack exchange,提问作者54138qqqq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:36:08