jaxb - 如何从多态类创建XML

时间:2011-09-21 12:29:49

标签: java xml jaxb polymorphism

我刚开始使用JAXB从java对象生成XML输出。我的java类中存在一个多态性,它似乎在JAXB中不起作用。

以下是我尝试处理它的方式,但在输出中我没有预期字段:fieldA或fieldB。

@XmlRootElement(name = "root")
public class Root {
    @XmlElement(name = "fieldInRoot")
    private String fieldInRoot;
    @XmlElement(name = "child")
    private BodyResponse child;
    // + getters and setters
}

public abstract class BodyResponse {
}

@XmlRootElement(name = "ResponseA")
public class ResponseA extends BodyResponse {
    @XmlElement(name = "fieldA")
    String fieldB;
    // + getters and setters
}

@XmlRootElement(name = "ResponseB")
public class ResponseB extends BodyResponse {
    @XmlElement(name = "fieldB")
    String fieldB;  
    // + getters and setters  
}

在我开始发明一些错综复杂的遗产之前,有没有什么好方法可以做到这一点?

2 个答案:

答案 0 :(得分:7)

对于您的用例,您可能希望利用@XmlElementRefs,这对应于XML Schema中替换组的概念:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
    @XmlElement
    private String fieldInRoot;
    @XmlElementRef
    private BodyResponse child;
    // + getters and setters
}

您还可以利用xsi:type属性作为继承指标:

EclipseLink JAXB(MOXy)也有@XmlDescriminatorNode / @XmlDescriminatorValue扩展名:

答案 1 :(得分:1)

@XmlRootElement(name = "root")
public class Root {
    ....

    @XmlElements({
        @XmlElement(type = ResponseA.class, name = "ResponseA"),
        @XmlElement(type = ResponseB.class, name = "ResponseB")})
    private BodyResponse child;

}

也许您的@XmlType(name = "ResponseX")课程需要Response