jackson + PageImpl redis 缓存,反序列化报
JsonMappingException: Can not construct instance of org.springframework.data.domain.PageImpl: no suitable constructor found,
can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
问题排查。
在进行项目迁移的时候,由于没注意到配置redis 序列化、反序列化的参数,导致报 can not deserialize from Object value (missing default constructor or creatorn 的错误。
问题是因为同事配置的redis 序列化方式用的 jackson。
而 jackson 在进行反序列化的时候,有一个特点,就是会 默认使用无参的构造函数进行反序列化。 如果对象没有无参的构造函数时,那么就会报这个错误。既能问题找到了,那么解决的方法应该很简单了吧~ 我加一个默认的构造方法不就好了。当你加好,编译完成,测试的时候有可能还会报 xxx no suitable constructor found,
can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
(⊙o⊙)…, 为啥, 是不是一脸懵逼,这就对了,哈哈。其实是因为你的属性对象中也有没有无参构造函数的对象造成的(eg: 有个属性是 instant 类型的啊)。 所以说还是有可能继续出错的。所以按照这个方案虽能有时候能弄好,但还是不太好。 所有还是修改redis 的序列化配置 比较妥当。 我修改后的配置是
/* 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);
jackson2JsonRedisSerializer.setObjectMapper(om);*/
RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
RedisSerializer stringRedisSerializer = new StringRedisSerializer();
//设置序列化器
redisTemplate.setDefaultSerializer(stringRedisSerializer);
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jdkSerializationRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jdkSerializationRedisSerializer);
主要是把Jackson2JsonRedisSerializer 改成了 jdkSerializationRedisSerializer ,其他的保持不变
网上也有说用 @JsonCreator注解来,指定构造函数,其实和上面自己加一个无参的构造函数一样。如果引用的是jdk 自带或者是第三方jar 的java 类。就不方便修改了,所以还是用jdkSerializationRedisSerializer 方便
参考 :
https://www.concretepage.com/questions/334
https://github.com/peachyy/jackson-jpapage
https://www.baeldung.com/jackson-exception