CXF webservice JAXB 处理复杂数据类型方法

本文介绍了在CXF Webservice中,JAXB如何处理包括Integer和String在内的简单类型,以及如何解决处理List<Object>等复杂类型的报错问题。提出了三种解决方案:1) 使用具体类包装内部的List<Object>;2) 直接使用实现类代替接口;3) 利用XmlAdapter手动处理。详细讲解了XmlAdapter的工作原理,并提供了适配器的使用示例。
摘要由CSDN通过智能技术生成
假定有一个复杂类型如下
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表示形式,这样

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值