如何将XML解组到这个类?

时间:2014-12-16 12:33:18

标签: java xml jaxb

我想使用JAXB unmarshaller将XML解组为此类对象。

public class Pair<T1,T2> implements Serializable {
    private T1 first;

    private T2 second;

    public Pair(T1 first, T2 second) {
        this.first = first;
        this.second = second;
    }

    public T1 getFirst() {
        return first;
    }

    public void setFirst(T1 first) {
        this.first = first;
    }

    public T2 getSecond() {
        return second;
    }

    public void setSecond(T2 second) {
        this.second = second;
    }
}


public class TripPair<T1,T2> extends Pair<T1,T2> {

    public TripPair(T1 first, T2 second) {
        super(first, second);
    }
}

public class Fare extends Pricing implements Comparable<Fare> {

    private List<TripPair<Integer,Integer>> trips = new LinkedList<>();
}

XML文件

<fareGroups>
    <trips>
        <second>37</second>
        <first>0</first>
    </trips>
</fareGroups>

XML文件还包含其他数据并且已经解组,但遗憾的是,来自元素firstsecond的数据未被解组。我尝试将这些字段上的@XmlElement注释添加到Pair类,但没有成功。

使用XmlAdapter

public class PairAdapter extends XmlAdapter<String, Integer> {

    public String marshal(Integer val) throws Exception {
        return val.toString();
    }

    public Integer unmarshal(String val) throws Exception {
        return Integer.valueOf(val);
    }
}

public class Pair<T1,T2> implements Serializable {
    @XmlJavaTypeAdapter(PairAdapter.class)
    private T1 first;

    @XmlJavaTypeAdapter(PairAdapter.class)
    private T2 second;
}

1 个答案:

答案 0 :(得分:3)

您需要添加零参数构造函数,或为XmlAdapter类创建Pair以使其正确解组(请参阅:http://blog.bdoughan.com/2010/12/jaxb-and-immutable-objects.html)。

更新

  

我正在使用JAXB marshaller,当我进行调试时   非编组元素,它有错误的类型。 ElementNSImpl而不是   整数。

就JAXB而言,firstsecond将被视为类型Object,因为它在类级别Pair instenad中派生类型级别的元数据{ {1}}。因此,XML需要使用必要的类型信息来限定XML元素。这是使用Pair<Integer, Integer>属性完成的。

xsi:type

尝试使用您想要的数据填充对象模型,然后对其进行编组,您将看到XML应该是什么样的解组操作。