我使用springdataredis来缓存一些数据 @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>
据我所知,反序列化时,jackson不知道特定对象的类型,因为它是 Object
创造了一个 LinkedHashMap
保存数据。也许我错了,但是如何实现将缓存的数据保存为json,以用于带有@cacheble的多种类型的对象呢?
1条答案
按热度按时间jm81lzqq1#
你是对的,你可以通过
GenericJackson2JsonRedisSerializer
. 但在您的示例中,您提供了自定义ObjectMapper
至GenericJackson2JsonRedisSerializer
以及GenericJackson2JsonRedisSerializer
不为您配置jackson的默认类型(您可以在GenericJackson2JsonRedisSerializer
). 你必须自己调整它并将其添加到objectmapper中这将包括json的类型信息。这样地