我有一个Shape
类,以及一个Circle
和Square
子类。然后,我有一个Container
类,它具有一个List<Shape> shapes
字段。
我正在用Jackson进行XML序列化,
<shapes><shape radius=".."><shape w=".." h=".."></shapes>
...但是我真正想要的是
<shapes><circle radius=".."><square w=".." h=".."></shapes>
我尝试用注释
shapes
@XmlElements({
@XmlElement(type = Circle.class),
@XmlElement(type = Square.class)
})
...但是那给了我
<shapes><shapes><Circle radius=".."></shapes><shapes><Square w=".." h=".."></shapes></shapes>
...所以这几乎是正确的,但是那些包装纸很烦人。有什么办法可以得到我想要的,即使这意味着更改我的JAXB实现?
最佳答案
选项之一是使用@XmlElementRef批注。摘自javadoc:
该批注将XML元素名称与JavaBean属性动态关联。当使用XmlElement注释JavaBean属性时,XML元素名称是从JavaBean属性名称静态派生的。但是,使用此批注时使用,XML元素名称是从运行时的JavaBean属性类型的实例派生的。
因此,您可以执行以下操作:
@XmlRootElement
class Container {
//...
//without XmlElementWrapper <shapes> element will be omitted
@XmlElementWrapper(name="shapes")
@XmlElementRef
public List<Shape> getShape() {
//your logic here
}
}
查看javadoc中的约束。您可能需要用
Shape
注释Circle
,Square
和@XmlRootElement
,以便工作:@XmlRootElement
class Circle {
//no-arg constructor
Circle() {
}
}