Как создать XML из полиморфных классов - PullRequest
5 голосов
/ 21 сентября 2011

Я только начал использовать JAXB для вывода XML из Java-объектов.Полиморфизм существует в моих классах 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 ]

7 голосов
/ 21 сентября 2011

В вашем случае вы, вероятно, захотите использовать @XmlElementRefs, это соответствует концепции групп замещения в XML-схеме:

@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 голос
/ 21 сентября 2011
@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 классах.

...