前面講的一些都是簡單類型,cxf都支持。可是有些複雜類型,cxf是不支持,好比經常使用的Map類型;java
下面咱們在前面的實例基礎上在加一個方法,好比咱們如今有個需求,獲取全部用用戶以及對應的每一個用戶全部角色信息;程序員
服務器端:web
HelloWorld接口加方法:數組
/** * 獲取全部用戶以及對應的角色 * @return */ public Map<String,List<Role>> getRoles();
HelloWorldImpl實現類加方法實現:服務器
public Map<String, List<Role>> getRoles() { // TODO Auto-generated method stub Map<String,List<Role>> map=new HashMap<String,List<Role>>(); List<Role> roleList1=new ArrayList<Role>(); roleList1.add(new Role(1,"技術總監")); roleList1.add(new Role(2,"架構師")); map.put("wishwzp", roleList1); List<Role> roleList2=new ArrayList<Role>(); roleList2.add(new Role(1,"程序員")); map.put("jack", roleList2); return map; }
而後咱們啓動Server類:發現報錯:架構
這個報錯信息說,不支持該類型;eclipse
這裏咱們有好幾種解決方案,這裏咱們用最經常使用的一種,使用適配器,把cxf不能接受的類型經過適配器,轉能接受的類型。ide
咱們使用@XmlJavaTypeAdapter註解,加在接口定義上,完整接口代碼以下:工具
package com.wishwzp.webservice; import java.util.List; import java.util.Map; import javax.jws.WebService; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import com.wishwzp.adapter.MapAdapter; import com.wishwzp.entity.Role; import com.wishwzp.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(); }
這裏參數須要一個實現了XmlAdapter類的適配器類;測試
package com.wishwzp.adapter; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; import com.wishwzp.entity.MyRole; import com.wishwzp.entity.Role; /** * Map適配器 * @author Administrator * */ 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; } }
這裏的話XmlAdapter要加兩個參數,XmlAdapter<ValueType,BoundType>
ValueType是cxf能接收的類型,這裏我用了數組;
BoundType是cxf不能接受的類型,也就是我例子裏的需求的Map類型;
這裏你們會看到,還有一個MyRole自定義類型,key:value。咱們搞成兩個屬性,具體實現以下:
package com.wishwzp.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; } }
OK 這樣就好了。咱們運行Server類,發佈webservice接口:
而後就到了webservice客戶端,咱們用wsdl2java工具生成下最新代碼,具體過程前面講過,這裏不重複講:
個人地址是:D:\eclipse_workspace\WS_Client\src\main\java 大家的可能和我不同:
而後咱們進入dos,進入上面的本地硬盤地址,而後執行命令:wsdl2java http://192.168.0.110/helloWorld?wsdl
生成代碼以下:
咱們修改下Client類:
package com.wishwzp.webservice; import java.util.List; public class Client { public static void main(String[] args) { HelloWorldService service=new HelloWorldService(); HelloWorld helloWorld=service.getHelloWorldPort(); //System.out.println(helloWorld.say("wishwzp測試")); // User user=new User(); // user.setUserName("jack"); // user.setPassword("123456"); // List<Role> roleList=helloWorld.getRoleByUser(user); // for(Role role:roleList){ // System.out.println(role.getId()+","+role.getRoleName()); // } MyRoleArray array=helloWorld.getRoles(); List<MyRole> roleList=array.item; for(int i=0;i<roleList.size();i++){ MyRole my=roleList.get(i); System.out.print(my.key+":"); for(Role r:my.value){ System.out.print(r.getId()+","+r.getRoleName()+" "); } System.out.println(); } } }
運行下: