繁体   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