当使用 jaxb 解码时,我在类 A 中有一些东西:
public class A {
@XmlElements( { //
@XmlElement(name = "g", type = A.class),
@XmlElement(name = "x", type = X.class),
@XmlElement(name = "y", type = Y.class),
})
List<XXX> children;
}
也就是说,我有一个列表,children,由X:s和Y:s组成
现在我的问题是:我想继承 A,我想 重新定义“XmlElements”列表并将其绑定(bind)到相同的变量“children”, 喜欢:
public class B extends A {
@XmlElements( { //
@XmlElement(name = "g", type = B.class),
@XmlElement(name = "x", type = X.class),
@XmlElement(name = "y", type = Y.class),
@XmlElement(name = "z", type = Z.class),
})
List<XXX> children;
}
上述问题有两个方面:
我创建了一个新的变量children,我想引用类A中的变量。
我想避免重新指定“x”和“y”,因为它们已在“A”中指定。
是否有一些好的模式可以实现这一点?
或者关于如何构建这样的东西的一些指针/文章或其他信息?
最佳答案
无法避免重新声明注释,但是您可以将注释从字段移到 getter 方法,只要您使用 @XmlAccessorType
告诉 JAXB 寻找公共(public) getter 方法而不是字段的注释。
因此您可以使用新的注释集覆盖 B
类中的 getChildren()
:
@XmlAccessorType(PROPERTY)
public class A {
private List<XXX> children;
@XmlElements( { //
@XmlElement(name = "g", type = A.class),
@XmlElement(name = "x", type = X.class),
@XmlElement(name = "y", type = Y.class),
})
public List<XXX> getChildren() {
return children;
}
public void setChildren(List<XXX> children) {
this.children = children;
}
}
@XmlAccessorType(PROPERTY)
public class B extends A {
@XmlElements( { //
@XmlElement(name = "g", type = B.class),
@XmlElement(name = "x", type = X.class),
@XmlElement(name = "y", type = Y.class),
@XmlElement(name = "z", type = Z.class),
})
public List<XXX> getChildren() {
return super.getChildren();
}
}
我不确定 JAXB 将如何处理覆盖的 getChildren()
方法。希望它会采用来自 B
的注释,但它可能会混淆。
试试看。
关于Java JAXB 如何将 XmlElements 重新定义为现有变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369348/