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
相关产品推荐
相关产品推荐

