WebService学习笔记(四)Map等非JavaBean类型传输

本文介绍如何在CXF框架中处理Map类型的参数,通过自定义适配器实现Map与JavaBean之间的转换,确保服务接口能正确传输Map数据。

CXF可以简单实现以String,User,List<User>等JavaBean类型作为形参或返回值进行传输。

String sayHello(String name);

User getUser(int id);

List<User> getAllUser();

但却不能传输Map类型的形参或返回值,为了实现这个功能,需要进行转换,将非JavaBean类型转换为JavaBean类型。


package com.skymr.hello.ws;

import java.util.Map;

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

import com.skymr.hello.ws.adapter.MapUserAdapter;
import com.skymr.hello.ws.model.User;


@WebService
public interface HelloWorld {
	
	public String sayHello(String name);
	
	public @XmlJavaTypeAdapter(MapUserAdapter.class)Map<String,User> getAllUsers();
}

使用@XmlJavaTypeAdapter进行注解,添加一个转换器,转换器自己实现,需要继承XmlAdapter

package com.skymr.hello.ws.adapter;

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

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

import com.skymr.hello.ws.model.User;

public class MapUserAdapter extends XmlAdapter<MapUserType, Map<String,User>>{

	@SuppressWarnings("unchecked")
	@Override
	public MapUserType marshal(Map<String, User> v) throws Exception {
		MapUserType ret = new MapUserType();
		List<MapUserType.Entry> list = new ArrayList<MapUserType.Entry>();
		for(Object o :v.entrySet()){
			String key = ((Map.Entry)o).getKey().toString();
			User user = (User)((Map.Entry)o).getValue();
			MapUserType.Entry entry = new MapUserType.Entry();
			entry.setKey(key);
			entry.setUser(user);
			list.add(entry);
		}
		ret.setEntryList(list);
		return ret;
	}

	@Override
	public Map<String, User> unmarshal(MapUserType v) throws Exception {
		Map<String,User> ret = new HashMap<String,User>();
		for(MapUserType.Entry entry : v.getEntryList()){
			ret.put(entry.getKey(), entry.getUser());
		}
		return ret;
	}

}
中转类型:Map可转换成其他JavaBean
package com.skymr.hello.ws.adapter;

import java.util.List;

import com.skymr.hello.ws.model.User;

public class MapUserType {

	
	public static class Entry{
		
		private String key;
		
		private User user;

		public String getKey() {
			return key;
		}

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

		public User getUser() {
			return user;
		}

		public void setUser(User user) {
			this.user = user;
		}
		
		
	}
	
	private List<Entry> entryList;

	public List<Entry> getEntryList() {
		return entryList;
	}

	public void setEntryList(List<Entry> entryList) {
		this.entryList = entryList;
	}
	
	
}

客户端调用时,返回值也不是Map类型,而是 MapUserType

package com.skymr.hello.ws.pub;

import com.skymr.hello.ws.Entry;
import com.skymr.hello.ws.HelloWorld;
import com.skymr.hello.ws.MapUserType;
import com.skymr.hello.ws.impl.HelloWorldws;

public class ClientMain {

	public static void main(String[] args){
		HelloWorldws factory = new HelloWorldws();
		HelloWorld hw = factory.getHelloWorldBeanPort();
		System.out.println(hw.sayHello("skymr"));
		
		MapUserType type = hw.getAllUsers();
		for(Entry entry : type.getEntryList()){
			System.out.println(entry.getKey()+","+entry.getUser().getUserName());
		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值