Web Service学习之六:CXF解决无法处理的数据类型
CXF不能够处理像Map复杂的数据类型,需要单独转换处理。
总体思路:创建一个转换器和一个对应的可以处理的数据结构类型,将不能处理的类型转换成可以处理的类型:
步骤:
一、创建一个可以处理的类型 举例:要转换Map<String,User>
package ws; import java.util.List; public class StringUser { public static class Entry { private String key; private User value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public User getValue() { return value; } public void setValue(User value) { this.value = value; } } private List<Entry> values; public List<Entry> getValues() { return values; } public void setValues(List<Entry> values) { this.values = values; } }
二、创建一个转换器,需要继承抽象类XmlAdapter<ValueType,BoundType>,其中ValueType是可以处理的类型 BoundType是不能处理的类型
package ws; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import ws.StringUser.Entry; /** * 该转换器负责将StringUser 与 Map<String, User>进行转换 * 其中第一个参数StringUser是CXF可以处理的类型 * 第二个参数 Map<String, User> 是CXF不能处理的类型*/ public class FKXmlAdapter extends XmlAdapter<StringUser, Map<String, User>> { /** * 将StringUser 转换成 Map<String, User> */ @Override public Map<String, User> unmarshal(StringUser v) throws Exception { Map<String, User> map = new HashMap<String, User>(); for (Entry u : v.getValues()) { map.put(u.getKey(), u.getValue()); } return map; } /** * 将 Map<String, User> 转换成 StringUser */ @Override public StringUser marshal(Map<String, User> v) throws Exception { StringUser u = new StringUser(); List<Entry> list = new ArrayList<Entry>(); for (String key : v.keySet()) { Entry e = new Entry(); e.setKey(key); e.setValue(v.get(key)); list.add(e); } u.setValues(list); return u; } }
三、Web Service中定义该方法 需要使用注解 @XmlJavaTypeAdapter(value=FKXmlAdapter.class)注明返回值对应的处理转换器
@WebMethod(operationName="getSecUsers") @WebResult(name="returninfo") public @XmlJavaTypeAdapter(value=FKXmlAdapter.class) Map<String, User> getSecUsers();
四、测试如下 查看WSDL文档 返回数据类型均为可解析的类型
服务端实现类:
package ws.impl; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.jws.WebService; import ws.HelloWordI; import ws.User; /** * 类说明 * @author wangjunyu * @createDate 2016-7-10 上午10:59:27 * @version V1.0 */ @WebService(endpointInterface="ws.HelloWordI",serviceName="HelloWordImpl") public class HelloWordImpl implements HelloWordI { public String sayHi(String name) { return name+",你好,当前时间是:"+new Date(); } public List<User> getUsers(User user) { System.out.println("测试:"+user.getName()); List<User> list = new ArrayList<User>(); User u1 = new User(); u1.setId("1"); u1.setName("小明"); list.add(u1); User u2 = new User(); u2.setId("2"); u2.setName("雪梅"); list.add(u2); return list; } @Override public Map<String, User> getSecUsers() { Map<String,User> map = new HashMap<String,User>(); User u1 = new User(); u1.setId("1"); u1.setName("小明"); map.put("一", u1); User u2 = new User(); u2.setId("2"); u2.setName("小红"); map.put("二", u2); return map; } }
package ws; import javax.xml.ws.Endpoint; import ws.impl.HelloWordImpl; public class ServerMain { public static void main(String[] args) { HelloWordI hw = new HelloWordImpl(); Endpoint.publish("http://192.168.0.104/test", hw); System.out.println("WebService 暴露成功!"); } }
客户端打印:
package ws; import java.util.List; import ws.impl.HelloWordImpl; public class ClientMain { /** * @param args */ public static void main(String[] args) { StringUser u = hw.getSecUsers(); System.out.println(u.getValues().get(0).getValue().getName()); System.out.println(u.getValues().get(1).getValue().getName()); } }
学习技术不是用来写HelloWorld和Demo的,而是要用来解决线上系统的真实问题的.