2

我有一个类,我希望使用 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?

4

1 回答 1

3

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

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;
  }

}

了解更多信息

于 2011-08-18T13:07:56.487 回答