如何编组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?或类似的东西?
答案 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) {}