如何使用genericjackson2jsonredisserializer

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

我使用springdataredis来缓存一些数据 @Cacheable . 我有多种类型的对象需要缓存,我需要redis的数据是json格式。我知道,默认情况下,使用的序列化程序是 JdkSerializationRedisSerializer ,但缓存的数据不是人类可读的。
我命令以我想要使用的json格式保存数据 GenericJackson2JsonRedisSerializer 我创造了一个习惯 ObjectMapper 也是:

  1. public RedisTemplate<Object, Object> redisTemplate (RedisConnectionFactory cf) {
  2. ObjectMapper objectMapper = new Jackson2ObjectMapperBuilder().failOnEmptyBeans(false)
  3. .failOnUnknownProperties(false)
  4. .indentOutput(false)
  5. .serializationInclusion(JsonInclude.Include.NON_NULL)
  6. .modules(
  7. // Optional
  8. new Jdk8Module(),
  9. // Dates/Times
  10. new JavaTimeModule()
  11. )
  12. .featuresToDisable(
  13. SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,
  14. DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS,
  15. SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS
  16. ).build();
  17. GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
  18. RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
  19. redisTemplate.setConnectionFactory(cf);
  20. redisTemplate.setKeySerializer(genericJackson2JsonRedisSerializer);
  21. redisTemplate.setHashKeySerializer(genericJackson2JsonRedisSerializer);
  22. redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
  23. redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
  24. return redisTemplate;

使用这个 RedisTemplate 不起作用,我总是会发现这个错误:

  1. 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中

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

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

  1. {
  2. "@class": "com.example.Foo",
  3. "field": "bar"
  4. }

相关问题