[英]JAXB: XmlAdapter for List<Object> items
有人知道如何將自定義XmlAdapter
附加到異構列表(如List)中包含的對象嗎? 例如,假設我們有一個包含雜類對象列表的容器類:
@XmlRootElement(name = "container")
public class Container {
private List<Object> values = new ArrayList<Object>();
@XmlElement(name = "value")
public List<Object> getValues() {
return values;
}
public void setValues(List<Object> values) {
this.values = values;
}
}
如果我們將String
-s, Integer
-s等放置,則默認情況下它們將被映射。 現在假設我們要放置一個自定義對象:
public class MyObject {
//some properties go here
}
顯而易見的解決方案是編寫一個自定義適配器:
public class MyObjectAdapter extends XmlAdapter<String, MyObject> {
//marshalling/unmarshalling
}
但是不幸的是,它不適用於包級@XmlJavaTypeAdapter
適配器從未調用過,因此編組失敗。 而且我不能直接將其應用於getValues()
,因為可能存在其他類型的對象。 @XmlJavaTypeAdapter
僅在容器中有MyObject類型的字段時才起作用(也具有包級注釋):
public class Container {
private MyObject myObject;
}
但這不是我想要的-我想要一個任意對象的列表。 我正在使用標准的Sun的JAXB實現:
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.3-1</version>
</dependency>
任何想法如何進行映射?
PS:一個小澄清-我想避免使用JAXB注釋對MyObject
進行注釋。 它可能是第三方庫中的類,不受我的控制。 因此,任何更改都應在MyObject
之外。
您可以嘗試更改MyObjectAdapter
以便擴展XmlAdapter<String, List<Object>>
。 所以它應該看起來像這樣:
public class MyObjectAdapter extends XmlAdapter<String, List<Object>> {
//marshalling/unmarshalling
}
當您還向Container
類中的getter添加XmlJavaTypeAdapter批注時,它應該可以工作。
@XmlRootElement(name = "container")
public class Container {
private ArrayList<Object> values = new ArrayList<Object>();
@XmlElement(name = "value")
@XmlJavaTypeAdapter(MyObjectAdapter.class)
public ArrayList<Object> getValues() {
return values;
}
public void setValues(ArrayList<Object> values) {
this.values = values;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.