我正在尝试使用JAXB包装2个遵循Composite模式构建的类。
我建造的所有东西都是这样的:
public interface ICriterion {String somemethod(String arg);}
@XmlRootElement(name = "criterion")
@XmlAccessorType(XmlAccessType.FIELD)
public class Criterion implements ICriterion {
@XmlElement String name;
@XmlElement String data;
//getter, setter, somemethod(), Criterion(), Criterion(String, String)
}
@XmlRootElement(name = "criteria")
@XmlAccessorType(XmlAccessType.FIELD)
public class Criteria implements ICriterion {
@XmlAnyElement(lax=true)
private final List<ICriterion> criteria;
//getter, setter, somemethod(),
Criteria(){criteria = new ArrayList<>();}
Criteria(List<ICriterion>)...
}
我从这个answer
中得到了这个解决方案它适用于编组 - 我可以提供一个Criteria,它包含一个Criteria和Criterions列表,它被正确地封送到xml。
然而,什么不起作用是将字符串解组为对象
String request =
<criteria>
<criteria>
<criterion>
<name>number1</value>
<data>123123</token>
</criterion>
<criterion>
<name>number2</value>
<data>1223323</token>
</criterion>
</criteria>
<criterion>
<name>number3</value>
<data>1212</token>
</criterion>
</criteria>
JAXBContext ctx = JAXBContext.newInstance(Criteria.class, Criterion.class);
StringReader reader = new StringReader(request);
Criteria wrapped = (Criteria) ctx.createUnmarshaller().unmarshal(reader);
给出:
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
我尝试过其他可以通过以下在线资源获得的方式:
@XmlElementRefs({ @XmlElementRef(type=Criterion.class), @XmlElementRef(type=Criteria.class)})
@XmlElements({@XmlElement(type=Criteria.class),@XmlElement(type=Criterion.class)})
不会出错,但会导致List为空。这个问题的解决方案是使用@XmlAnyElement(lax=true)
,这对我不起作用。
我的第一个猜测是,我的构造函数中没有正确初始化List,而JAXB使用某种固定大小的列表。 我的对策是在no-Args构造函数中显式初始化列表
Criteria(){criteria = new ArrayList<>();}
通过明确地将“critera”改为ArrayList<>
而不是List<>
,问题也无法解决。
我错过了什么?