嘿,我有两节课.当我尝试从它们创建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(){
}
}
Run Code Online (Sandbox Code Playgroud)
您可能需要@XmlSeeAlso在顶级类中使用注释:
@XmlSeeAlso(B.class)
@XmlRootElement(name = "a")
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class A{
Run Code Online (Sandbox Code Playgroud)
我写'可能',因为它取决于你如何设置你的JAXB上下文.基本上,您需要确保JAXB知道所有应该序列化的类.如果你的B类在其他地方没有提到(例如,作为JAXB已知的类之一的属性类型),那么JAXB就没有机会知道如何序列化实例B.@XmlSeeAlso注释的目的是确保JAXB也查看这些列出的类.
更新:
或者,您可以在创建JAXBContext对象时提供所有子类的列表JAXBContext.newInstance(Class...),例如:
JAXBContext.newInstance(A.class, B.class);
Run Code Online (Sandbox Code Playgroud)
代替
JAXBContext.newInstance(A.class);
Run Code Online (Sandbox Code Playgroud)
你可能已经做过了.
但我认为这是一个更糟糕的解决方案,因为每次在代码中使用JAXB时,它都会让您考虑相关的类.在顶级解决方案中,您可以永久地设置关系.