ArrayList上的JAXBElement?

时间:2012-03-16 11:24:51

标签: java jaxb marshalling

如何编组JAXBElement列表?

我有一个我无法注释的POJO,例如:

public class APojo {

private String aString;

public APojo() { 
    super(); 
}

public String getAString() {
    return aString;
}

public void setAString(String aString) {
    this.aString = aString;
}
}

所以我这样做

APojo aPojo = new APojo();
aPojo.setaString("a string");       
JAXBElement<APojo> aJAXBedPojo = new JAXBElement<APojo>(new QName("apojo"), APojo.class, aPojo);

哪个是正确编组的。

然而

List<JAXBElement<APojo>> list = new ArrayList<JAXBElement<APojo>>();

不工作:当我这样做时

JAXBContext context = JAXBContext.newInstance(APojo.class, ArrayList.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(list, System.out);

运行时引发:

[com.sun.istack.internal.SAXException2: unable to marshal type "java.util.ArrayList" as an element because it is missing an @XmlRootElement annotation]

这是正常的,因为ArrayList没有注释。

我知道我可以在ArrayList周围创建一个包装器并用@XmlRootElement注释它,这样我就可以编组这个包装器了。

我正在寻找没有这种包装器的解决方案。是否可以创建一个JAXBElement,其中T是一个ArrayList?或类似的东西?

2 个答案:

答案 0 :(得分:2)

我强烈建议您使用XmlAdapter。您可以简单地使用marshaller注册适配器,它将使用带注释的适配器类代替您无法注释的类。

另外,我认为包装类比没有包装器时尝试做更干净。

话虽如此,如果你真的想,你可以尝试以下方法:

List<JAXBElement<APojo>> list = new ArrayList<JAXBElement<APojo>>();
JAXBElement<List<JAXBElement<APojo>>> listElement = new JAXBElement<List<JAXBElement<APojo>>>(new QName("apojolist"), List.class, list);

答案 1 :(得分:0)

最好的解决方案似乎是构建一个像解释here一样的包装器。

由于我的目标是从REST Web服务返回我的列表,因此我将列表包含在javax.ws.rs.core.GenericEntity内更简单,就像这样

new GenericEntity<List<APojo>>(aPojo) {}