2013-03-06 48 views
7

有誰知道如何定製XmlAdapter附載於異質列表中的對象(如表)? 例如 - 假設我們有一個容器類miscelaneous對象的列表:JAXB:XmlAdapter的列表<Object>項目

@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的類型的字段集裝箱(也與包級annotaton)工作原理:

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> 

任何想法如何做映射?

P.S:一個小小的澄清 - 我想避免註釋MyObject與JAXB註解。它可能是一個不受我控制的來自第三方庫的課程。所以任何改變都應該在MyObject之外。

+0

'ContextResolver'可能是一個很好的解決方案... – Mark 2017-03-06 16:56:19

回答

0

你可以試着改變你的MyObjectAdapter使延伸XmlAdapter<String, List<Object>>。因此,它應該是這個樣子:

public class MyObjectAdapter extends XmlAdapter<String, List<Object>> { 
    //marshalling/unmarshalling 
} 

當你還在你Container類添加一個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; 
    } 
}