JAXB:List 项的 XmlAdapter
2024-01-13

有谁知道如何附加自定义XmlAdapter包含在异构列表(如列表)中的对象? 例如 - 假设我们有一个包含杂项对象列表的容器类:

@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>

有什么想法如何进行映射吗?

P.S.:一点小小的澄清——我想避免注释MyObject带有 JAXB 注释。它可能是来自第三方库的类,不受我的控制。所以任何改变都应该在MyObject.


你可以尝试改变你的MyObjectAdapter这样就延伸了XmlAdapter<String, List<Object>>。所以它应该看起来像这样:

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

当您还向 getter 添加 XmlJavaTypeAdapter 注释时Container类,它应该有效。

@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;
    }   
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAXB:List 项的 XmlAdapter 的相关文章

随机推荐