嘿 我有2节课。 当我尝试从它们创建XML结构时,我只获得根元素(A)。 为什么?我使用了错误的注释吗?
@XmlRootElement(name = "a")
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class A{
@XmlElement
int a;
protected A(){
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class B extends A{
@XmlElement
int b;
protected B(){
}
}
答案 0 :(得分:7)
您可能需要在顶级课程中使用@XmlSeeAlso
注释:
@XmlSeeAlso(B.class)
@XmlRootElement(name = "a")
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class A{
我写'可能',因为它取决于你如何设置你的JAXB上下文。基本上,您需要确保JAXB知道所有应该序列化的类。如果你的B
类没有在其他地方被提及(例如,作为其中一个类的属性类型
已经为JAXB所知,然后JAXB没有机会知道如何序列化B
的实例。 @XmlSeeAlso
注释的目的是确保JAXB也查看这些列出的类。
更新:
或者,您可以在使用JAXBContext.newInstance(Class...)
创建JAXBContext
对象时提供所有子类的列表,例如:
JAXBContext.newInstance(A.class, B.class);
而不是
JAXBContext.newInstance(A.class);
你可能已经做过了。
但是我认为这是一个更糟糕的解决方案,因为每次在代码中使用JAXB时,它都会让你想到相关的类。在顶级解决方案中,您可以永久设置关系。