axis2和cxf复合类型参数传递(绝对权威)
首先服务端是由CXF发布的服务CXF服务版本为2.2,之前说过2.3JDK需要1.6的,本人用1.5版本。
本章只讲对象数组的传递和List类型的传递。
CXF客户端:
本人用的CXF版本为2.2和2.3均可以通过。
首先是客户端包装接口,只需要定义和服务接口一样即可,名称可以任意,但是包名必须相同。
如:客户端定义接口如下(跟服务端一样哦):
@WeService
public class IHelloWorld {
User[] getUsers(User[] user){
return user;
}
List<User> getListUser(List<User> user){
return user;
}
}
User.java我就不写了,很简单。
客户端调用:
JaxWsProxyFactoryBean factory1 = new JaxWsProxyFactoryBean();
??factory1.setServiceClass(IHelloWorld.class);
??factory1.setAddress("http://127.0.0.1:8088/**/IHelloWorld");
??QName qName1 = new QName("命名空间");//wsdl文件中targetNameSpace的值
??factory1.setServiceName(qName1);
??IHelloWorld service = (IHelloWorld) factory1.create();
List<User>?list = new ArrayList<User>();
??User user = new User();
??user.setAge(25);
??user.setName("fei");
??User[] users = new User[]{user};?
?list.add(user);
//直接可以调用了
System.out.println(service.getUsers(users));
System.out.println(service.getListUser(users));
OK CXF的调用就可以。如有问题可以联系我
AXIS2客户端:
axis2调用还是要注意一些问题的。我用的jdk是1.4的版本比较低,在实现的过程中让我很头疼,大家最好还是用1.5之上的吧。另外大家最好用axis2 1.4版本的,因为之前的版本与CXF服务端访问时,SOAP可能无法解析会出错。
因为axis无法直接传递list和对象数组参数,1.4是这样的高版本就不晓得了。所以必须封装一下我们建一个Users.java
public class Users{
private User[] user;
private List userList;
//get和set方法
}
User.java就不写了
客户端调用:写在MAIN方法里,如果做项目就写在action里
???RPCServiceClient serviceClient = new RPCServiceClient();
??Options options = serviceClient.getOptions();
??EndpointReference targetEPR = new EndpointReference("http://localhost:8088/**/HelloWorld?wsdl");
??options.setTo(targetEPR);
??QName name2 = new QName("targetNameSpace", "getUsers");
??QName name3 = new QName("targetNameSpace"getListUser");
??Users users = new Users();
??User[] user2 = new User[2];
??List list = new ArrayList();
??for (int i = 0; i < 2; i++) {
???User user1 = new User();
???user1.setName("fei" + i);
???user1.setAge(24 + i);
???user2[i] = user1;
???list.add(user1);
??}
??users.setUsers(user2);
??users.setUserList(list);
??Object[] object1 = new Object[] { users };
??Class[] classes2 = new Class[] { Users.class };
??Class[] classes3 = new Class[] { List.class };
??Object[] object3 = serviceClient.invokeBlocking(name2, object1, classes2);
??System.out.println(object3.toString());
??Object[] object4 = serviceClient.invokeBlocking(name3, object1, classes3);
??List list1 = (List) object4[0];
??System.out.println(list1.size());
??OK ,Axis2的访问也很简单。有问题请留言。
?