有人知道如何将自定义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()
,因为可能存在其他类型的对象。
只有在Container中有MyObject类型的字段(也包含包级别注释)时,@XmlJavaTypeAdapter
才有效:
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
之外。
答案 0 :(得分:1)
您可以尝试更改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;
}
}