我刚开始使用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
}
在我开始发明一些错综复杂的遗产之前,有没有什么好方法可以做到这一点?
答案 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
。