如何使用genericjackson2jsonredisserializer

0tdrvxhp  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(281)

我使用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的多种类型的对象呢?

jm81lzqq

jm81lzqq1#

你是对的,你可以通过 GenericJackson2JsonRedisSerializer . 但在您的示例中,您提供了自定义 ObjectMapperGenericJackson2JsonRedisSerializer 以及 GenericJackson2JsonRedisSerializer 不为您配置jackson的默认类型(您可以在 GenericJackson2JsonRedisSerializer ). 你必须自己调整它并将其添加到objectmapper中

objectMapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY);

这将包括json的类型信息。这样地

{
  "@class": "com.example.Foo",
  "field": "bar"
}

相关问题