2013-03-06 33 views
7

有谁知道如何定制XmlAdapter附载于异质列表中的对象(如表)? 例如 - 假设我们有一个容器类miscelaneous对象的列表:JAXB:XmlAdapter的列表<Object>项目

@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的类型的字段集装箱(也与包级annotaton)工作原理:

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之外。

+0

'ContextResolver'可能是一个很好的解决方案... – Mark 2017-03-06 16:56:19

回答

0

你可以试着改变你的MyObjectAdapter使延伸XmlAdapter<String, List<Object>>。因此,它应该是这个样子:

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

当你还在你Container类添加一个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; 
    } 
}