Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jaxb-如何从多态类创建XML_Java_Xml_Jaxb_Polymorphism - Fatal编程技术网

Java jaxb-如何从多态类创建XML

Java jaxb-如何从多态类创建XML,java,xml,jaxb,polymorphism,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")

我刚刚开始使用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  
}
在我开始发明一些复杂的继承之前,有什么好方法可以做到这一点吗

@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”)

对于您的用例,您可能希望利用
@xmlementrefs
,这与XML模式中的替换组概念相对应:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
    @XmlElement
    private String fieldInRoot;
    @XmlElementRef
    private BodyResponse child;
    // + getters and setters
}
您还可以利用
xsi:type
属性作为继承指示符:

EclipseLink JAXB(MOXy)还具有
@xmlDescriptionatorNode
/
@xmlDescriptionatorValue
扩展名:


JAXB中的
@XmlElements
映射用于表示选择结构()。对于这个继承用例,替换组的概念更合适,并且映射为
@xmlementrefs
()。是的,这非常有效。谢谢你的这篇文章和你的博客。