如何整理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注释它,这样我就可以封送这个包装器。
我正在寻找一个没有这样的包装器的解决方案。是否可以创建T为ArrayList的JAXBElement?或者类似的东西?
发布于 2013-05-06 01:08:52
最好的解决方案似乎是像here解释的那样构建一个包装器。
因为我的目标是从REST web服务返回我的列表,所以将列表包装在javax.ws.rs.core.GenericEntity中对我来说更简单,如下所示
new GenericEntity<List<APojo>>(aPojo) {}发布于 2012-03-16 21:21:35
我强烈建议您使用XmlAdapter。您可以简单地向编组程序注册适配器,它将使用带注释的适配器类来代替您无法注释的类。
此外,我认为包装器类将比尝试在没有包装器的情况下做一些事情更干净。
也就是说,如果你真的想这样做,你可以尝试以下方法:
List<JAXBElement<APojo>> list = new ArrayList<JAXBElement<APojo>>();
JAXBElement<List<JAXBElement<APojo>>> listElement = new JAXBElement<List<JAXBElement<APojo>>>(new QName("apojolist"), List.class, list);https://stackoverflow.com/questions/9736385
复制相似问题