WebService CXF學習(進階篇2):複雜對象傳遞(List,Map)

前面講到了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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章