[英]Java JAXB how to redefine XmlElements to existing variable
当使用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'中指定。
是否有一些良好的模式来实现这一目标?
或者一些关于如何构建这样的东西的指针/文章或其他信息?
没有避免重复声明注释,但是您可以将注释从字段移动到getter方法,只要您使用@XmlAccessorType
注释告诉JAXB查找公共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
获取注释,但它可能会让人感到困惑。
试试看吧。
当在父级中使用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属性我使用临时技巧我试图更换更好的东西:我在子窗体中覆盖了方法,在父覆盖方法中我不得不使用@XmlElement但是我没有将继承的类类型添加到JAXB.newinstance调用中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.