jackson can not deserialize from Object value (missing default constructor or creatorn

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值