使用kotlin 搭配redis 存储json格式数据的问题
Redis 配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// json 序列化
redisTemplate.setValueSerializer(RedisSerializer.json());
RedisSerializer<String> stringRedisSerializer = RedisSerializer.string();
// 使用StringRedisSerializer来序列化和反序列化redis的key值
redisTemplate.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// hash的value序列化方式采用jackson
redisTemplate.setHashValueSerializer(RedisSerializer.json());
return redisTemplate;
}
|
在使用redistemplate 时,我们使用json格式默认存储value,然后发现每次存进去的数据都会少@class
在取出数据反序列化的时候会报错
GenericJackson2JsonRedisSerializer
文件
1
2
3
4
5
6
7
8
9
10
|
public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) {
this(new ObjectMapper());
registerNullValueSerializer(this.mapper, classPropertyTypeName);
if (StringUtils.hasText(classPropertyTypeName)) {
this.mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName);
} else {
this.mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
}
}
|
查看源码,发现在这个jackson的配置中,默认使用了DefaultTyping.NON_FINAL
而在 kotlin中 我们的类 默认是final
的 需要添加在类前面添加open
修饰符
或者你也可以使用使用自定义objectMapper 并设置 ObjectMapper.DefaultTyping.EVERYTHING