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 を正しく構成し、そのロジックを別の場所に延期したいと考えています。代わりに TreeSet を構築するように JAXB に指示するにはどうすればよいですか?

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 に答える