簡體   English   中英

JAXB:用於列表的XmlAdapter <Object> 項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM