1.必须包
asm-3.3.jar
commons-logging-1.1.1.jar
cxf-2.4.0.jar
neethi-3.0.0.jar
wsdl4j-1.6.2.jar
xmlschema-core-2.0.jar
2.定义接口
package com.cxf.ws; import java.util.Map; import javax.jws.WebParam; import javax.jws.WebService; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.cxf.domain.UserMan; import com.cxf.domain.adapter.MyHashMapAdapter; @WebService public interface IUserServiceWs { UserMan getUserByName( @WebParam(name="UserName") String name); //Map类型需要特别处理 @XmlJavaTypeAdapter(value=MyHashMapAdapter.class) Map<String, UserMan> getUserMapByName( @WebParam(name="UserName") String name); }
3。定义实现类
package com.cxf.ws.impl; import java.util.Map; import javax.jws.WebService; import com.cxf.domain.UserMan; import com.cxf.service.impl.UserServiceImp; import com.cxf.ws.IUserServiceWs; //实现的接口+服务名 @WebService(endpointInterface="com.cxf.ws.IUserServiceWs", serviceName="UserServiceWs") public class UserServiceWs implements IUserServiceWs { //Spring注入Service private UserServiceImp userService; public void setUserService(UserServiceImp userService) { this.userService = userService; } @Override public UserMan getUserByName(String name) { return userService.getUserName(name); } @Override public Map<String, UserMan> getUserMapByName(String name) { return userService.getUserMapByName(name); } }
4.Map传输需要自定义类型转换
package com.cxf.domain.change; import java.util.ArrayList; import java.util.List; import com.cxf.domain.UserMan; public class MyHashMapType { // Map的列表 private List<MyHashMapEntryType> entrys=new ArrayList<MyHashMapType.MyHashMapEntryType>(); //结构类似Map中的Entry元素 public static class MyHashMapEntryType { private String key; private UserMan value; public MyHashMapEntryType() {} public MyHashMapEntryType(String key, UserMan value) { this.key = key; this.value = value; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public UserMan getValue() { return value; } public void setValue(UserMan value) { this.value = value; } } public List<MyHashMapEntryType> getEntrys() { return entrys; } public void setEntrys(List<MyHashMapEntryType> entrys) { this.entrys = entrys; } }
5定义Map与自定义类型的转换
package com.cxf.domain.adapter; import java.util.HashMap; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import com.cxf.domain.UserMan; import com.cxf.domain.change.MyHashMapType; import com.cxf.domain.change.MyHashMapType.MyHashMapEntryType; //XmlAdapter按F2查看帮助,这里不能是HashMap 要是Map,使用接口 public class MyHashMapAdapter extends XmlAdapter<MyHashMapType, Map<String, UserMan>>{ @Override//自定义转换为Map public Map<String, UserMan> unmarshal(MyHashMapType v) throws Exception { HashMap<String, UserMan> map=new HashMap<String, UserMan>(); for (MyHashMapEntryType myHashMapEntryType : v.getEntrys()) { map.put(myHashMapEntryType.getKey(), myHashMapEntryType.getValue()); } return map; } @Override//Map转换为你自定义 public MyHashMapType marshal(Map<String, UserMan> v) throws Exception { MyHashMapType hashMapType=new MyHashMapType(); for (String s : v.keySet()) { hashMapType.getEntrys().add(new MyHashMapEntryType(s, v.get(s))); } return hashMapType; } }