我有一个类,我希望使用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?
答案 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;
}
}
了解更多信息