java - 如何使用 GenericJackson2JsonRedisSerializer
问题描述
我正在使用 Spring Data Redis 来缓存一些数据@Cacheable
。我有多种类型的对象需要缓存,并且我需要来自 Redis 的数据为 JSON 格式。我知道,默认情况下,使用的序列化程序是JdkSerializationRedisSerializer
,但是缓存的数据不是人类可读的。
我命令以我想要使用的 JSON 格式保存数据,GenericJackson2JsonRedisSerializer
并且我也创建了一个自定义ObjectMapper
:
public RedisTemplate<Object, Object> redisTemplate (RedisConnectionFactory cf) {
ObjectMapper objectMapper = new Jackson2ObjectMapperBuilder().failOnEmptyBeans(false)
.failOnUnknownProperties(false)
.indentOutput(false)
.serializationInclusion(JsonInclude.Include.NON_NULL)
.modules(
// Optional
new Jdk8Module(),
// Dates/Times
new JavaTimeModule()
)
.featuresToDisable(
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS,
SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS
).build();
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
redisTemplate.setKeySerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
return redisTemplate;
使用它RedisTemplate
不起作用,我总是得到这个错误:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to <some class>
据我了解,在反序列化时,杰克逊不知道特定对象的类型,因为它Object
创建了一个LinkedHashMap
来保存数据。也许我对此有误,但是如何使用@Cacheble 将缓存数据保存为 JSON 以用于多种类型的对象?
解决方案
你是对的,你可以用GenericJackson2JsonRedisSerializer
. 但是在您的示例中,您提供自定义并且不为您配置ObjectMapper
Jackson的默认类型(您可以在 中检查默认构造函数逻辑)。您必须自己调整它并将其添加到您的 ObjectMapperGenericJackson2JsonRedisSerializer
GenericJackson2JsonRedisSerializer
GenericJackson2JsonRedisSerializer
objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);
这将包括 JSON 的类型信息。像这样
{
"@class": "com.example.Foo",
"field": "bar"
}
推荐阅读
- android - 如何使用 Kotlin 创建带有圆形指示器的 Android Auto Image Slider?
- python - 为什么我的 django 服务器在添加更改后没有关闭几秒钟?在服务器用于添加更改后停止一段时间之前
- reactjs - 当我尝试初始化一个反应项目时,它给了我漏洞并且项目没有运行
- azure-functions - Azure Function App 的服务总线扩展中的 maxAutoRenewDuration 和 lockduration 有什么用?
- go - 在 Go 中 slice[0:0] 做了什么?
- ios - React-native 中的自定义按钮设计“使用 Apple 登录”
- python - Python - 左序二进制矩阵
- javascript - 通过锚标签或 window.open 打开 chrome 扩展
- clip-path - 对背景 img 使用剪辑路径,但对带有 img 的 div 不使用
- excel - 合并工作表,但在已合并数据的末尾添加新插入的行