开发者

jaxb - how to create XML from polymorphic classes

I've just started using JAXB to make XML output from java objects. A polymorphism exists in my java classes, which seems to not working in JAXB.

Below is the way how I tried to deal with it, but in the output I haven't expected field: fieldA or 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 = "fie开发者_StackOverflow社区ldB")
    String fieldB;  
    // + getters and setters  
}

Before I start invent some intricate inheritances, is there any good approach to do this?


For your use case you will probably want to leverage @XmlElementRefs, this corresponds to the concept of substitution groups in XML Schema:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
    @XmlElement
    private String fieldInRoot;
    @XmlElementRef
    private BodyResponse child;
    // + getters and setters
}
  • http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-substitution.html

You can also leverage the xsi:type attribute as the inheritance indicator:

  • http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html

EclipseLink JAXB (MOXy) also has the @XmlDescriminatorNode/@XmlDescriminatorValue extension:

  • http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-moxy-extension.html


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

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

}

Maybe you need an @XmlType(name = "ResponseX") on your Response classes.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜