关于jakson反序列化报错

报错信息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.ycw.demo.entity.propItem.PropItemStoreStruct` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (String)"

序列化
序列化不会遇到任何挑战。因为不管变量的真实类型是什么,Jackson 总是会通过所有的 getter 方法来找到所有的属性和值,并序列化到 Json 中。

反序列化
反序列化就不同了,因为程序不知道 Json 应该对应到哪一个子类。

有两种原因

一、
传入的class对象没有无参构造器,具体原因是在该对象上同时使用了@Data和@AllArgsConstructor注解,@AllArgsConstructor阻止了@Data生成(无参)构造器,从而该对象只有一个全参构造器,没有无参构造器,导致反序列化失败。

解决方法:
显式添加无参构造器或使用@NoArgsConstructor

二、

abstract public class PropItemStoreStruct {}
PropItemStoreStruct propItemStoreStruct = new ObjectMapper().readValue(json, PropItemStoreStruct.class);

而PropItemStoreStruct抽象类又不能创建出实例,所以这一行代码就会因为这个限制而出错。

解决方案:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
abstract public class PropItemStoreStruct {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值