2011-08-18 56 views
2

我有一個類,我希望使用JAXB從XML文件中填充內容。我的XML文件看起來與此類似:解組JAXB中的TreeSet

<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?

+0

我在寫作時部分回答了我自己的問題:由於我需要保留自己的自然排序,所以它應該首先是SortedSet。我改變了這一點,解組正在正常工作。我仍然希望聽到關於我的設置的任何想法,特別是我更願意指定JAXB正在選擇的實現,而不是依靠魔法...... – seanhodges

回答

2

來解決這個問題最簡單的方法是你Set財產預先初始化相應的執行類型,以及您的JAXB implmentation(地鐵,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; 
    } 

} 

更多信息

+0

今晚我會試試這個,它聽起來像一個非常優雅的解決方案if有用。 – seanhodges

+1

它肯定會工作,更多信息請參閱:http://blog.bdoughan.com/2011/01/jaxb-and-choosing-list-implementation.html –

+0

這工作,雖然我選擇將字段定義爲SortedSet相反,它們具有相同的效果。謝謝你的幫助! – seanhodges