JAXB无法识别类型继承

mah*_*nya 3 java xml inheritance jaxb

我有一个JAXB生成的类,其集合的抽象类型为COBJECT.

COBJECT有多个后代,这些后代也有抽象的后代.类层次结构的片段如下:

COBJECT (abstract)
|
|---CDEFINEDOBJECT
    |
    |--CDOMAINTYPE (abstract)
       |
       |---CCODEPHRASE 
Run Code Online (Sandbox Code Playgroud)

当我将CCODEPHRASE的对象添加到类型为COBJECT的集合时,例如

protected List<COBJECT> children;
Run Code Online (Sandbox Code Playgroud)

JAXB尝试创建一个抽象类型的COBJECT,但它失败了.我试过补充一下

@XmlElementRefs({
        @XmlElementRef(type = ARCHETYPEINTERNALREF.class),
        @XmlElementRef(type = CONSTRAINTREF.class),
        @XmlElementRef(type = CDEFINEDOBJECT.class),
        @XmlElementRef(type = ARCHETYPESLOT.class),
        @XmlElementRef(type = CCODEPHRASE.class)        
    })
protected List<COBJECT> children;
Run Code Online (Sandbox Code Playgroud)

在子字段之前,但我得到"类型或其任何子类未知"的异常响应.

XML输入包含XSI:TYPE = ...属性.如何让JAXB处理这个继承结构?

bdo*_*han 10

您需要确保JAXBContext知道父类和所有子类型.这可以通过在创建JAXBContext时传递全部内容来完成.

JAXBContext.createContext.newInstance(Parent.class, Child1.class, Child2.class);
Run Code Online (Sandbox Code Playgroud)

或者你可以提出一个@XmlSeeAlso注释.这允许您指定所有子类,以便在创建JAXBContext时只需要包含根:

@XmlSeeAlso({Child1.class, Child2.class}) {
public class Parent {
}
Run Code Online (Sandbox Code Playgroud)

有关JAXB和继承的更多信息