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