【问题标题】:JAXB: XmlAdapter for List<Object> itemsJAXB:用于 List<Object> 项的 XmlAdapter
【发布时间】:2013-03-06 16:19: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.:一个小的澄清 - 我想避免使用 JAXB 注释来注释 MyObject。它可能是我无法控制的第三方库中的一个类。所以任何更改都应该在MyObject 之外。

【问题讨论】:

  • ContextResolver 在这里可能是一个很好的解决方案...

标签: java jaxb jaxb2


【解决方案1】:

您可以尝试更改您的MyObjectAdapter 以扩展XmlAdapter&lt;String, List&lt;Object&gt;&gt;。所以它应该看起来像这样:

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;
    }   
}

【讨论】:

  • 您能否详细说明您的编组代码。因为我有相同的场景来实现和创建包含对象列表的 XML 结构,并且我已经使用了 XmlAdapter> 但生成的 XML 仅包含 1 个对象而不是对象列表。这是我的问题 - stackoverflow.com/questions/51589574/… 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 1970-01-01
  • 2012-10-21
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多