在JAXB中解组TreeSet

时间:2011-08-18 08:58:07

标签: java jaxb generic-collections

我有一个类,我希望使用JAXB填充XML文件中的内容。我的XML文件看起来与此类似:

<root>
  <mylist>
    <item id="1">First Item</item>
    <item id="2">Second Item</item>
  </mylist>
</root>

我的JAXB注释类看起来像:

@XmlRootElement
class MyParentClass {

  // I always populate this with a TreeSet
  private Set<MyFieldItem> items;

  public void setItems(Set<MyFieldItem> items) {
    this.items = items;
  }

  @XmlElementWrapper("mylist") @XmlElement("item")
  public Set<MyFieldItem> getItems() {
    return items;
  }
}

class MyFieldItem implements Comparable<MyFieldItem> {
  private Integer id;
  private String value;

  public void setId(Integer id) {
    this.id = id;
  }

  @XmlAttribute
  public Integer getId() {
    return id;
  }

  public void setValue(String value) {
    this.value = value;
  }

  @XmlValue
  public String getValue() {
    return value;
  }

  public int compareTo(MyfieldItem o) {
    return this.id.compareTo(o.getId());
  }
}

我发现这种安排将我的对象正确地序列化为XML,但当我尝试将其转换回 TreeSet 时,我使用的是 HashSet

理论上我的集合可以修复为TreeSet(它确实可以解决问题),但我宁愿正确配置JAXB并将该逻辑推迟到别处。我如何告诉JAXB构建一个TreeSet?

1 个答案:

答案 0 :(得分:2)

解决此问题的最简单方法是将Set属性预初始化为相应的实现类型,并且您的JAXB实现(Metro,EclipseLink MOXy,Apache JaxMe等)将使用它而不是创建一个新集:

package forum7104810;

import java.util.Set;
import java.util.TreeSet;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="root")
class MyParentClass {

  // Initialize this property with an instance of the desired type.
  private Set<MyFieldItem> items = new TreeSet<MyFieldItem>();

  public void setItems(Set<MyFieldItem> items) {
    this.items = items;
  }

  @XmlElementWrapper(name="mylist") 
  @XmlElement(name="item")
  public Set<MyFieldItem> getItems() {
    return items;
  }

}

了解更多信息