【发布时间】: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在这里可能是一个很好的解决方案...