Разоблачение TreeSet в JAXB - PullRequest
       18

Разоблачение TreeSet в JAXB

2 голосов
/ 18 августа 2011

У меня есть класс, который я хочу заполнить содержимым из файла XML, используя JAXB. Мой 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 Ответ

2 голосов
/ 18 августа 2011

Самый простой способ решить эту проблему - предварительно инициализировать свойство 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;
  }

}

для получения дополнительной информации

...