`
wanghuanqiu
  • 浏览: 108582 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

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的访问也很简单。有问题请留言。

 

分享到:
评论
6 楼 shyarhwang 2013-03-25  
请问一下user类有userid,username,userpass等字段,还有一个List<Role> roles的字段,现在通过getUser(User user)来获得一个完整的User,但是获得roles全是一些类似wsdl里面的内容,请问怎么解决
5 楼 wanghuanqiu 2012-06-07  
devilyard 写道
wanghuanqiu 写道
devilyard 写道
请问我用axis2传递xml到服务端时,为什么服务端总不拿到,总是null

你是如何访问的?

服务端是CXF发布的,客户端用axis2的RPCClient访问,传过去服务端就是拿不到参数

RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
		"http://127.0.0.1:8080/xx/services/xxService?wsdl");
options.setTo(targetEPR);
		
String[] opAddEntryArgs = new String[] { "<request action=\"submit\"><person><personName>赵云</personName><sexCode>1</sexCode><idCard>440600196912113473</idCard></person></request>" };
Class[] classes = new Class[] { Object.class };
QName opAddEntry = new QName("http://server.xx.soft.com", "execute");
serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes);


传过去的参数是new object[]{},不是String,返回类型应该是String不是object
4 楼 wanghuanqiu 2012-06-07  
devilyard 写道
wanghuanqiu 写道
devilyard 写道
请问我用axis2传递xml到服务端时,为什么服务端总不拿到,总是null

你是如何访问的?

服务端是CXF发布的,客户端用axis2的RPCClient访问,传过去服务端就是拿不到参数

RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
		"http://127.0.0.1:8080/xx/services/xxService?wsdl");
options.setTo(targetEPR);
		
String[] opAddEntryArgs = new String[] { "<request action=\"submit\"><person><personName>赵云</personName><sexCode>1</sexCode><idCard>440600196912113473</idCard></person></request>" };
Class[] classes = new Class[] { Object.class };
QName opAddEntry = new QName("http://server.xx.soft.com", "execute");
serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes);

你确定代码可以访问到服务端是吧
3 楼 devilyard 2012-06-07  
wanghuanqiu 写道
devilyard 写道
请问我用axis2传递xml到服务端时,为什么服务端总不拿到,总是null

你是如何访问的?

服务端是CXF发布的,客户端用axis2的RPCClient访问,传过去服务端就是拿不到参数

RPCServiceClient serviceClient = new RPCServiceClient();
Options options = serviceClient.getOptions();
EndpointReference targetEPR = new EndpointReference(
		"http://127.0.0.1:8080/xx/services/xxService?wsdl");
options.setTo(targetEPR);
		
String[] opAddEntryArgs = new String[] { "<request action=\"submit\"><person><personName>赵云</personName><sexCode>1</sexCode><idCard>440600196912113473</idCard></person></request>" };
Class[] classes = new Class[] { Object.class };
QName opAddEntry = new QName("http://server.xx.soft.com", "execute");
serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes);
2 楼 wanghuanqiu 2012-05-30  
devilyard 写道
请问我用axis2传递xml到服务端时,为什么服务端总不拿到,总是null

你是如何访问的?
1 楼 devilyard 2012-05-30  
请问我用axis2传递xml到服务端时,为什么服务端总不拿到,总是null

相关推荐

Global site tag (gtag.js) - Google Analytics