报错信息:
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 {}