我有一个JAXB生成的类,其集合的抽象类型为COBJECT。
COBJECT有多个后代,这些后代也有抽象的后代。 类层次结构的片段如下:
COBJECT (abstract)
|
|---CDEFINEDOBJECT
|
|--CDOMAINTYPE (abstract)
|
|---CCODEPHRASE
当我将CCODEPHRASE的对象添加到类型为COBJECT的集合时,例如
protected List<COBJECT> children;
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;
在children字段之前,但我得到“Type或其任何子类未知”的异常响应。
XML输入包含XSI:TYPE = ...属性。如何让JAXB处理这个继承结构?
答案 0 :(得分:9)
您需要确保JAXBContext
知道父类和所有子类型。这可以通过在创建JAXBContext时全部传入来完成。
JAXBContext.createContext.newInstance(Parent.class, Child1.class, Child2.class);
或者你可以提出@XmlSeeAlso
注释。这允许您指定所有子类,以便在创建JAXBContext时只需要包含根:
@XmlSeeAlso({Child1.class, Child2.class}) {
public class Parent {
}
有关JAXB和继承的更多信息