关于使用SpringDataRedis配置序列化方式时报错

104 阅读1分钟

SpringBoot下RedisConfig配置

/**
 * @author novo
 * @date 2022/1/2-22:13
 */
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory){
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //为string类型的key设置序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //为string类型的value设置序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        //redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));
        //为hash设置序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 设置 RedisConnection 工厂。 它就是实现多种 Java Redis 客户端接入的工厂
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        return redisTemplate;
    }
}

报错信息

org.springframework.data.redis.serializer.SerializationException: 
Could not read JSON: Cannot construct instance of `com.novo.springdataredis.pojo.User` 
(no Creators, like default constructor, exist):
cannot deserialize from Object value (no delegate- or property-based Creator)

Cannot construct instance of `com.novo.springdataredis.pojo.User` 
(no Creators, like default constructor, exist): 
cannot deserialize from Object value (no delegate- or property-based Creator)

后面两行信息说的很清楚了

就是pojo类的默认构造器不存在,也就是没有无参构造器,反序列化对象失败

简单来说JVM反序列化对象需要一个无参构造器

网上一篇博客通过源码解析:关于Java反序列化是否需要空参构造器

复习一下 {% post_link Java/Java对象序列化反序列化 %}

总结一下反序列化操作失败的几点原因

  • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
  • 该类包含未知数据类型
  • 该类没有可访问的无参数构造方法