类层次结构的JAXB注释

Udi*_*Udi 5 java xml jaxb

嘿,我有两节课.当我尝试从它们创建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)

Grz*_*zki 7

您可能需要@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时,它都会让您考虑相关的类.在顶级解决方案中,您可以永久地设置关系.