假定有一个复杂类型如下
这样就把内部的接口List<Object> 给包装成了实际的一个类,这个类里面又维护了一个实际的 child 类型为 ArrayList,child里面又维护了一个实际的Object 他们都不是接口,都是具体的可构造出来的类,并且也保护了多态的特性
这样改写的话,从外到内都是具体的类,只不过第二层的List失去了多态的特性只能是一个实际的ArrayLIst
public class Client {
private Integer idclientinfo;
private String clientname;
private String tel1;
private String tel2;
private String fax;
private String email;
private String address;
private String city;
private String province;
private String country;
private String mailaddress;
private String owner;
private String corporation_types;
private String switchboard;
private List<List<Object>> childs = new ArrayList<List<Object>>();
private List<String> groups = new ArrayList<String>();
}
假设我们有一个方法 public Client getClient(){
// return a Client instance;
}
方法返回的是Client的一个实例 JAXB会找到你定义的Client类 ,然后一层层的向复杂类型里面去识别,将复杂类型 分解为一个个的简单类型
对于Integer String 这些基础类型JAXB 已经能为我们很好的处理
对于List<String> 他虽然是接口 ,但他的实例groups 是ArrayList<String> ,这是一个具体类,有自己默认的constructor 那个JAXB也可以为我们处理
对于List<List<Object>> 虽然 childs 是一个具体的ArrayList<List<Object>>();
但是childs里面还嵌套了一个LIst<Object> 这是一个接口类型,如果我们不对其进行处理 JAXB会报如下错误
List is a interface JAXB can't handle it
因些我们有如下三种方法去处理
方法1: 用具体的类去wrapper 内部的 List<Object>接口
改写为
public class Type {
private List<Object> child = new ArrayList<Object>();
public List<Object> getChild() {
return child;
}
public void setChild(List<Object> child) {
this.child = child;
}
}
List<Type> childs = new ArrayList<Type>();
这样就把内部的接口List<Object> 给包装成了实际的一个类,这个类里面又维护了一个实际的 child 类型为 ArrayList,child里面又维护了一个实际的Object 他们都不是接口,都是具体的可构造出来的类,并且也保护了多态的特性
方法2:抛弃多态直接用实现类
List<ArrayList<Object>> childs = new ArrayList<ArrayList<Object>>();
这样改写的话,从外到内都是具体的类,只不过第二层的List失去了多态的特性只能是一个实际的ArrayLIst
方法3:用XmlAdapter 手动处理
新创建一个类 MyXmlAdapter 让他继承自 XmlAdapter
因为JAXB不支持将HashMap 或其他非 JavaBean 类 自然映射到xml表示形式,这样