【发布时间】:2019-07-31 23:04:44
【问题描述】:
我一直在尝试更改 spring-boot redis 缓存的默认序列化程序,因为我想从默认更改为 Jackson2Json 实现之一。 Jackson2Json 库中有两个实现,其中之一是:GenericJackson2JsonRedisSerializer,我可以将其用于以下 bean 实例化:
@Bean
@Primary
public RedisCacheConfiguration defaultCacheConfig(ObjectMapper objectMapper) {
return RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(
SerializationPair.fromSerializer(
new StringRedisSerializer()
)
)
.serializeValuesWith(
SerializationPair.fromSerializer(
new GenericJackson2JsonRedisSerializer(objectMapper)
)
)
.prefixKeysWith("");
}
当我使用此序列化程序时,序列化工作正常,所有内容都存储在 redis 服务器上,但是当我尝试反序列化存储在 redis 服务器上的 JSON 时,我收到以下异常:
java.util.LinkedHashMap cannot be cast to tutorial.Person with root cause
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to tutorial.Person
缓存的使用方式如下:
@Cacheable(cacheNames = "person", key = "'person:'.concat(#post.id)")
public Person findPostAuthor(Post post){
}
序列化器不知道如何从 LinkedHashMap 转换为 Person,我该如何告诉他如何去做?
我尝试使用的另一个序列化器是 Jackson2JsonRedisSerializer:
@Bean
@Primary
public RedisCacheConfiguration defaultCacheConfig(ObjectMapper objectMapper) {
Jackson2JsonRedisSerializer<Person> serializer = new Jackson2JsonRedisSerializer<>(Person.class);
serializer.setObjectMapper(objectMapper);
return RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(
SerializationPair.fromSerializer(
new StringRedisSerializer()
)
)
.serializeValuesWith(
SerializationPair.fromSerializer(
serializer
)
)
.prefixKeysWith("");
}
通过这种方式,我必须为保存在 redis 缓存中的每个对象声明一个 bean,但我可以正确地序列化/反序列化。
当我直接在 redis 缓存中插入 JSON 时,我无法使用此序列化程序对其进行反序列化,序列化程序只会给我一个带有空名称、电子邮件和 id 属性的 Person 对象。有没有办法解决这个问题?
如果有办法改进我的问题,请告诉我。
【问题讨论】:
标签: java spring-boot caching redis spring-data-redis