JAXB Unmarshal接口列表

时间:2016-01-07 13:34:55

标签: java xml jaxb

我正在尝试使用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<>,问题也无法解决。

我错过了什么?

0 个答案:

没有答案