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<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。
希望对你有帮助
【讨论】:
以上是关于Spring数据redis在反序列化List类型时返回null的主要内容,如果未能解决你的问题,请参考以下文章
ServiceStack 文本设置以在反序列化 json 时推断原始值类型
Newtonsoft.JSON 在反序列化数组中被双引号包围的对象时窒息