前面講到了JavaBean對象的傳遞,這一節我們就CXF框架複雜對象(List,Map)的傳遞進行講解。
第一步:創建存儲複雜對象的類(因爲WebServices的複雜對象的傳遞,一定要藉助第三方對象(即自定義對象)來實現)
package com.ws.model;
import java.util.ArrayList;
import java.util.HashMap;
public class Users {
private ArrayList<UserInfo> userList; // 不要用List類型
private HashMap<Integer, UserInfo> userMap; // 不要用Map類型
private UserInfo[] userArray;
// geter/seter 方法
}
第二步:創建WebServices的服務端接口和實現類
package com.ws.services;
import javax.jws.WebService;
import com.ws.model.UserInfo;
import com.ws.model.Users;
@WebService
public interface IUserServices {
public Users getAllUsers();
public Users getUsersMap();
public Users getUsersArray();
}
package com.ws.services.impl;
import java.util.ArrayList;
import java.util.HashMap;
import javax.jws.WebService;
import com.ws.model.UserInfo;
import com.ws.model.Users;
import com.ws.services.IUserServices;
@WebService
public class UserServicesImpl implements IUserServices {
public Users getAllUsers() {
ArrayList<UserInfo> list = new ArrayList<UserInfo>();
list.add(new UserInfo("vicky",23));
list.add(new UserInfo("ivy",26));
list.add(new UserInfo("simon",26));
list.add(new UserInfo("carol",29));
Users users = new Users();
users.setUserList(list);
return users;
}
public Users getUsersMap() {
HashMap<Integer, UserInfo> map = new HashMap<Integer, UserInfo>();
map.put(23, new UserInfo("vicky",23));
map.put(22, new UserInfo("caty",22));
map.put(24, new UserInfo("leah",24));
map.put(25, new UserInfo("kelly",25));
map.put(27, new UserInfo("ivy",27));
map.put(26, new UserInfo("simon",26));
map.put(29, new UserInfo("carol",29));
Users users = new Users();
users.setUserMap(map);
return users;
}
public Users getUsersArray() {
UserInfo[] userInfo = new UserInfo[5];
for(int i=0;i<5;i++){
UserInfo info = new UserInfo();
info.setUserAge(23+i);
info.setUserName("Array"+(i+1));
userInfo[i] = info;
}
Users users = new Users();
users.setUserArray(userInfo);
return users;
}
}
第三步:創建WebServices的服務端
package com.test;
import javax.xml.ws.Endpoint;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import com.ws.services.impl.UserServicesImpl;
public class ServerTest {
public ServerTest(){
// 發佈User服務接口
Endpoint.publish("http://localhost:8090/userInfoServices", new UserServicesImpl());
}
public static void main(String[] args) {
// 啓動服務
new ServerTest();
System.out.println("Server ready...");
try {
Thread.sleep(1000*300);//休眠五分分鐘,便於測試
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Server exit...");
System.exit(0);
}
}
第四步:創建WebServices的客戶端,並測試
1、將服務端創建的複雜對象的類和接口copy到客戶工程中,且路徑要與服務端一致;
2、新建測試類進行測試
package com.ws.client;
import java.util.List;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.ws.model.UserInfo;
import com.ws.model.Users;
import com.ws.server.IUserServices;
public class UserTest {
public static void main(String[] args) {
//創建WebService客戶端代理工廠
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//註冊WebService接口
factory.setServiceClass(IUserServices.class);
//設置WebService地址
factory.setAddress("http://localhost:8090/userInfoServices");
IUserServices userServices = (IUserServices)factory.create();
System.out.println("invoke userinfo webservice...");
// 測試Map
// testMap(userServices);
// 測試List
// testList(userServices);
// 測試Array
// testArray(userServices);
System.exit(0);
}
public static void testArray(IUserServices userServices){
Users users = userServices.getUsersArray();
if(users!=null){
UserInfo[] array = users.getUserArray();
for(UserInfo info:array){
System.out.println("UserName: "+info.getUserName());
System.out.println("UserAge : "+info.getUserAge());
}
}
}
public static void testList(IUserServices userServices){
Users users = userServices.getAllUsers();
if(users!=null){
List<UserInfo> list = users.getUserList();
for(UserInfo info:list){
System.out.println("UserName: "+info.getUserName());
System.out.println("UserAge : "+info.getUserAge());
}
}
}
public static void testMap(IUserServices userServices){
Users users = userServices.getUsersMap();
if(users!=null){
UserInfo info = users.getUserMap().get(23);
System.out.println("UserName: "+info.getUserName());
System.out.println("UserAge : "+info.getUserAge());
}
}
}
第五步:運行服務端,驗證webservices服務是否發佈成功
第六步:運行客戶端,驗證是否成功調用webservices服務
注:在做webServices複雜對象傳遞時,返回值的類型不要用接口類型。例如(List 應該換成ArrayList ,Map應該換成HashMap)