kri*_*onz 2 java caching redis spring-data-redis spring-boot
我一直在尝试更改 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("");
}
Run Code Online (Sandbox Code Playgroud)
当我使用这个序列化程序时,序列化工作正常,所有内容都存储在 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
Run Code Online (Sandbox Code Playgroud)
缓存的使用方式如下:
@Cacheable(cacheNames = "person", key = "'person:'.concat(#post.id)")
public Person findPostAuthor(Post post){
}
Run Code Online (Sandbox Code Playgroud)
序列化器不知道如何从 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("");
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我必须为 redis 缓存中保存的每个对象声明一个 bean,但我可以正确地序列化/反序列化。
当我直接在 redis 缓存中插入一个 JSON 时,我无法使用这个序列化程序反序列化它,序列化程序只会给我一个具有空名称、电子邮件和 id 属性的 Person 对象。有没有办法来解决这个问题?
如果有办法改善我的问题,请告诉我。
GenericJackson2JsonRedisSerializer假设 Jackson 的默认类型为。当您GenericJackson2JsonRedisSerializer使用ObjectMapper实例创建时,请确保配置默认类型 ( enableDefaultTyping(…))。
默认类型最适用于非最终类型,并且需要在所有 JSON 负载中的类型具有一致的属性名称,以便 Jackson 可以识别要反序列化为的适当类型。
默认类型使用动态类型标记,如果您的数据源(Redis 实例)不是完全可信的,那么这可能会成为一个安全问题。
Jackson2JsonRedisSerializer 固定到特定类型并消除动态类型风险。
| 归档时间: |
|
| 查看次数: |
7775 次 |
| 最近记录: |