类层次结构的JAXB注释

时间:2011-05-17 12:42:37

标签: java xml jaxb

嘿 我有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(){
    }
}    

1 个答案:

答案 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时,它都会让你想到相关的类。在顶级解决方案中,您可以永久设置关系。