jackson 多态反序列化的时候找不到对应的类型Id

om.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class cn.cc.hkzk.dto.ComponentLink]: missing type id property 'componentType'

父类:

@JsonTypeInfo(
        use = JsonTypeInfo.Id.NAME,
        include = JsonTypeInfo.As.PROPERTY,
        property = "componentType"
)
@JsonSubTypes({
        @JsonSubTypes.Type(value = ComponentLink4Task.class, name = "task"),
        @JsonSubTypes.Type(value = ComponentLink4Module.class, name = "module")
})
public abstract class ComponentLink {

子类:

@Slf4j
@Data
public class ComponentLink4Module extends ComponentLink {}
@Slf4j
@Data
public class ComponentLink4Task extends ComponentLink {}

在序列化的时候就没有问题,但是在反序列化的时候会上述错误,这里的原因是jackson 在序列化的时候并不会将外层对象也添加类型id即componentType 这个字段。这个时候如果你使用的外层对象也是多态那么就无法反序列化。
解决方案就是自己再创建一个对象这个对象无需多态序列化,把这个对象作为外层对象的时候就可以实现反序列化了
例如:

import lombok.Data;

import java.util.List;

/**
 * 使用这个对象的原因是在jackson里使用多态序列化和反序列化是,在反序列化的时候会无法反序列化多态多项这个时候需要一层包装对象(不需要多态反序列化的对象)
 *
 */
@Data
public class ComponentLinkHolder {
    private List<ComponentLink> componentLinkList;
}

问题得到解决

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容