java redis 序列化 java 8 中 localdate, localdatetime 出现的 问题?

  1. 在使用redis时, redis 序列化出错

    Could not read JSON: Can not construct instance of com.xxx.xxx.controller.TestObj: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
  2. 我使用了

    <!-- json serialization -->
        <dependency>
            <groupId>com.fasterxml.jackson.module</groupId>
            <artifactId>jackson-module-parameter-names</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jdk8</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
        </dependency>

redis 的配置:

 @Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(factory);

    Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
            Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

    om.registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module())
            .registerModule(new JavaTimeModule()); 
    om.findAndRegisterModules();

    jackson2JsonRedisSerializer.setObjectMapper(om);

    template.setKeySerializer(new GenericToStringSerializer<Object>(Object.class));
    template.setHashKeySerializer(new GenericToStringSerializer<Object>(Object.class));
    template.setValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
}

但是没有什么效果,序列化出来的字符串没有类型信息, 无法反序列化

如何实现redis的 RedisSerializer 接口?

阅读 7.1k
1 个回答

错误信息如下:

Could not read JSON: Can not construct instance of com.xxx.xxx.controller.TestObj: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)

解决:

  1. 在序列化的对象中,需要加入无参构造器
  2. 其他配置
@Bean
  public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
      RedisTemplate<Object, Object> template = new RedisTemplate<>();
      template.setConnectionFactory(factory);

      Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(
              Object.class);
      ObjectMapper om = new ObjectMapper();
      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

      om.registerModule(new ParameterNamesModule())
              .registerModule(new Jdk8Module())
              .registerModule(new JavaTimeModule()); // new module, NOT JSR310Module
      om.findAndRegisterModules();

      om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

      jackson2JsonRedisSerializer.setObjectMapper(om);

      template.setKeySerializer(new GenericToStringSerializer<>(Object.class));
      template.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));

      template.setValueSerializer(jackson2JsonRedisSerializer);

      template.afterPropertiesSet();
      return template;
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题