Spring数据redis在反序列化List类型时返回null

Posted

技术标签:

【中文标题】Spring数据redis在反序列化List类型时返回null【英文标题】:Spring data redis returns null on deserializing List type 【发布时间】:2019-02-08 16:43:23 【问题描述】:

我正在使用 spring data redis,我的一个实体有一个如下列表。

@RedisHash("person")
@Data
@Builder
public class Person implements Serializable 

    @Id
    private String name;
    private List<Address> addressList;



public class Address implements Serializable 

    private String postCode;
    private String country;


序列化工作正常,地址存储为

 HGETALL person:123456
 "name"
 "blabla"
 "address[0].postCode"
 "1111XX"
 "address[1].country"
 "IN"

但是在让这个人回来时,列表总是 null 吗?有人可以指出我在这里做错了什么。

我的 Redis 配置如下所示。

@Configuration
@EnableRedisRepositories
public class RedisConfiguration 

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() 
        return new JedisConnectionFactory();
    

    @Bean
    public RedisTemplate<String, String> redisTemplate() 
        final RedisTemplate<String, String> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        mapper.findAndRegisterModules();

        template.setKeySerializer(redisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    

【问题讨论】:

我也有同样的问题,请问你是怎么解决的? 【参考方案1】:

我有些怀疑,但你能否分享更多关于如何使用 redisTemplate 将数据保存到 redis 中的代码 sn-p?

但很可能是因为您设置了 RedisTemplate 的 Key 和 Values 初始化

RedisTemplate&lt;K, V&gt;&lt;String, String&gt;

这就是为什么即使使用 Jackson2JsonSerializer 也无法正确序列化和反序列化 List&lt;Address&gt; 类。

一个可能的解决方案是:

@Bean
    public RedisTemplate<String, Person> redisTemplate(JedisConnectionFactory jedisConnectionFactory) 
        RedisTemplate<String, Person> redisTemplate = new RedisTemplate<>();

        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

        return redisTemplate;
    

然后你将整个 Person 对象存储到 Redis 中

当您需要它时,您可以取出整个对象并实现您的 getter 和 setter。

希望对你有帮助

【讨论】:

以上是关于Spring数据redis在反序列化List类型时返回null的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack 文本设置以在反序列化 json 时推断原始值类型

Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息

spring-boot Cache redis 类型转换错误

redis数据类型

redis存list(int)如何转换成string

redis怎么存放一个list