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对象序列化反序列化 %}
总结一下反序列化操作失败的几点原因
- 该类的序列版本号与从流中读取的类描述符的版本号不匹配
- 该类包含未知数据类型
- 该类没有可访问的无参数构造方法