【问题标题】:jaxb - how to create XML from polymorphic classesjaxb - 如何从多态类创建 XML
【发布时间】:2011-09-21 12:29:49
【问题描述】:

我刚刚开始使用 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  
}

在我开始发明一些复杂的继承之前,有什么好的方法可以做到这一点吗?

【问题讨论】:

    标签: java xml jaxb polymorphism


    【解决方案1】:

    对于您的用例,您可能希望利用 @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 扩展:

    【讨论】:

    • 是的,效果很好。感谢这篇文章和对您博客的引用。
    【解决方案2】:
    @XmlRootElement(name = "root")
    public class Root {
        ....
    
        @XmlElements({
            @XmlElement(type = ResponseA.class, name = "ResponseA"),
            @XmlElement(type = ResponseB.class, name = "ResponseB")})
        private BodyResponse child;
    
    }
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多