使用CXF处理Map等CXF无法自动转换的复合数据类型的形参和返回值

webservice 新民 2006℃ 已收录 1评论

在CXF开发中,如果遇到CXF无法处理的数据类型需要试用以下方法:

使用@XmlJavaTypeAdapter修饰CXF 无法处理的类型,使用该注解时,需要通过value属性指定一个转换器。

在web service 服务器端HelloWord类添加如下代码:

package com.xm.cxf.ws;

import java.util.List;
import java.util.Map;

import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.xm.cxf.ws.domain.Cat;
import com.xm.cxf.ws.domain.User;
import com.xm.cxf.ws.util.FKXmlAdapter;

/**
 * ws接口
 * @author zhaoxinmin
 */
@WebService
public interface HelloWord {
	
	public String sayHi(String name);
	
	public List getCatByUser(User user );
	
	@XmlJavaTypeAdapter(FKXmlAdapter.class)
	public  Map<String, Cat> getAllCats();
}

在web service 服务器端建立一个转换类(FKXmlAdapter),该类继承XmlAdapter类,代码如下:

package com.xm.cxf.ws.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import com.xm.cxf.ws.domain.Cat;
import com.xm.cxf.ws.util.StringCat.Entry;

public class FKXmlAdapter  extends XmlAdapter<StringCat, Map>{

	@Override
	public Map<String, Cat> unmarshal(StringCat v) throws Exception {
		
		Map<String, Cat> result=new HashMap<String, Cat>();
		
		List entries = v.getEntries();
		for (Entry entry : entries) {
				result.put(entry.getKey(),entry.getValue());
		}
		return result;
	}

	@Override
	public StringCat marshal(Map<String, Cat> v) throws Exception {

		StringCat sc=new StringCat();
		for (String key: v.keySet()) {
			sc.getEntries().add(new Entry(key,v.get(key)));
		}
		return sc;
	}
}


在web service 服务器端建立一个工具类(StringCat),用来存储map中的值,代码如下:

package com.xm.cxf.ws.util;

import java.util.ArrayList;
import java.util.List;

import com.xm.cxf.ws.domain.Cat;

public class StringCat {
	
	public static class Entry{
		
		private String key;
		
		private Cat value;

		public Entry() {
			super();
		}

		public Entry(String key, Cat value) {
			super();
			this.key = key;
			this.value = value;
		}

		public String getKey() {
			return key;
		}

		public void setKey(String key) {
			this.key = key;
		}

		public Cat getValue() {
			return value;
		}

		public void setValue(Cat value) {
			this.value = value;
		}
	}
	
	

	private List  entries =new ArrayList<>();

	public List getEntries() {
		return entries;
	}

	public void setEntries(List entries) {
		this.entries = entries;
	}

}

在web service 服务器端userService接口中添加如下方法:

Map<String, Cat> getAllCats();

在userService实现类(UserServiceImpl)中添加如下代码:

@Override
	public Map<String, Cat> getAllCats() {
		
		Map<String, Cat> result=new HashMap<>();
		
		Collection<List> values = catDB.values();
		int i=1;
		for (List list : values) {
			for (Cat cat : list) {
				result.put("第"+ i++ +"个", cat);
			}
		}
		return result;
	}

此时,web service服务器 端开发完毕,运行web service 服务器端ServiceMain 类发布,结果如下:
image001

显示发布成功,在浏览器输入地址即可看到最新的wsdl文档如下图:

image003

打开dos窗口 ,再次使用CXF提供的wsdl2java 生成客户端代码到web service 项目中:

image006

命令顺利执行完毕,刷新MyEclipse中的web service 客户端项目,会看到最新的代码:

image007

在web service 客户端项目中的ClientMain 类中添加如下代码来调用web service 服务端的接口:

 List list = hw.getCatByUser(u);
	    
	    for (Cat cat : list) {
			System.out.println(cat.getName());
		}
	    
	    StringCat cats = hw.getAllCats();
	    for (Entry entry : cats.getEntries()) {
			System.out.println(entry.getKey()+"   "+entry.getValue().getName());
		}

运行此类,看到运行结果:
image009

本站文章如未注明,均为原创丨本网站采用BY-NC-SA协议进行授权,转载请注明转自:https://www.snowruin.com/?p=1541
喜欢 (3)or分享 (0)
发表我的评论
取消评论
表情 代码 贴图 加粗 链接 私信 删除线 签到

Hi,请填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)条精彩评论。
  1. 此贴有意思~
    雪雁2015-12-01 16:21 回复| unknow| unknow