我有一个Shape类,以及一个CircleSquare子类。然后,我有一个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注释CircleSquare@XmlRootElement,以便工作:
@XmlRootElement
class Circle {
    //no-arg constructor
    Circle() {
    }
}

09-11 19:40
查看更多