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

时间:2018-09-03 15:47:28

标签: redis spring-data spring-data-redis

我正在使用spring数据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 个答案:

答案 0 :(得分:0)

我有些怀疑,但是您可以分享一些有关如何使用redisTemplate将数据保存到redis的代码片段吗?

但是很可能是因为您同时设置了RedisTemplate的键和值初始化

RedisTemplate<K, V><String, String>

这就是为什么即使使用Jackson2JsonSerializer也无法正确地序列化和反序列化List<Address>类的原因。

可能的解决方案是:

@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。

希望这会有所帮助