当使用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;
}
也就是说,我有一个列表,孩子,由X:s和Y:s组成
现在我的问题:我想继承A,我想 重新定义'XmlElements'列表并将其绑定到同一个变量'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'中指定。
有没有一些好的模式来实现这个目标?
或者一些关于如何构建这样的东西的指针/文章或其他信息?
答案 0 :(得分:1)
没有避免重新声明注释,但是可以将注释从字段移动到getter方法,只要您使用@XmlAccessorType
注释来告诉JAXB寻找公共getter方法而不是字段。
因此您可以使用新的注释集覆盖类getChildren()
中的B
:
@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
获取注释,但它可能会被混淆。
试一试,看看。
答案 1 :(得分:1)
当在父级中使用PROPERTY @XmlAccessorType时,JAXB实际上将处理overriden方法,但是在输出xml数据中,JAXB可能还会在根标记属性中另外生成,例如: xsi:type =“ B“和xmlns:xsi =”http://www.w3.org/2001/XMLSchema-instance“,因为我们定义了一个从A继承的新类型B.所以从A类生成的xml将不会与B类生成的相同,因为JAXB正确添加了这两个属性,以通知我们定义了其他类型B.
我希望看到一种方法可以避免输出xml中的 xsi 和 xmlns 信息。 JAXB的这种行为非常好,但对我来说,在我的xml输出中不通知接收器,我已经使类扩展了我可能从客户端xsd模式中获取的原始类。
要从派生的子类生成xml但没有使用JAXB添加的 xsi 和 xmlns 属性,我使用了临时技巧,我试图用更好的东西进行交换:I在子窗口中覆盖了方法,在父覆盖方法中,我不得不使用@XmlElement但是我没有将继承的类类型添加到JAXB.newinstance调用中。