CXF webservice 比JDK的实现强多了,直接支持了复杂类型,类,集合(先不说MAp),但是,Map的类型要支持的话,要自己写一个适配器。
其实不光是Map,有一些类CXF也不能直接支持,比如sql里面有个什么TimeStamp也要搞适配器。
1 写一个适配器,让他继承XmlAdapter<MyRole[], Map<String,List<Role>>> 其中前面是转换后的类型,后面是目标类型,也就是待转换的类型。
package com.java1234.adapter; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import com.java1234.entity.MyRole; import com.java1234.entity.Role; public class MapAdapter extends XmlAdapter<MyRole[], Map<String,List<Role>>>{ /** * 适配转换 MyRole[] -> Map<String, List<Role>> */ @Override public Map<String, List<Role>> unmarshal(MyRole[] v) throws Exception { Map<String, List<Role>> map=new HashMap<String,List<Role>>(); for(int i=0;i<v.length;i++){ MyRole r=v[i]; map.put(r.getKey(), r.getValue()); } return map; } /** * 适配转换 Map<String, List<Role>> -> MyRole[] */ @Override public MyRole[] marshal(Map<String, List<Role>> v) throws Exception { MyRole[] roles=new MyRole[v.size()]; int i=0; for(String key:v.keySet()){ roles[i]=new MyRole(); roles[i].setKey(key); roles[i].setValue(v.get(key)); i++; } return roles; } }
2 转换之后的类型是MyRole[] , 所以得写一个类MyRole,
package com.java1234.entity; import java.util.List; /** * 自定义实体 cxf能接受 * @author Administrator * */ public class MyRole { private String key; private List<Role> value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public List<Role> getValue() { return value; } public void setValue(List<Role> value) { this.value = value; } }
3 在webService的接口里面(不是实现里面哦)加适配器注解 @XmlJavaTypeAdapter(MapAdapter.class)
package com.java1234.webservice; import java.util.List; import java.util.Map; import javax.jws.WebService; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.java1234.adapter.MapAdapter; import com.java1234.entity.Role; import com.java1234.entity.User; @WebService public interface HelloWorld { public String say(String str); public List<Role> getRoleByUser(User user); /** * 获取所有用户以及对应的角色 * @return */ @XmlJavaTypeAdapter(MapAdapter.class) public Map<String,List<Role>> getRoles(); }
原文:http://www.cnblogs.com/hzzhero/p/5616966.html