- jacksonSeial.setObjectMapper(om);这句话可能会影响一个错误
- 解决方式:在User类中添加无参的构造方法
- 错误提示 ;不存在像默认构造函数那样的创建者:无法从对象值反序列化(没有基于委托或基于属性的创建者)
- 可能原因:redis的这些序列化方式,需要 无参构造函数进行创建对象,
当方法中存在有参的构造函数,默认存在的无参构造函数是不存在的(继承自object),所以需要补上无参的构造方法,
实际上spring在注入对象的时候也是通过无参构造函数,反射创建对象的,可能也与这个有关
源码
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance ,
ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jacksonSeial.setObjectMapper(om);
template.setValueSerializer(jacksonSeial);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}