首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

axis和cxf客户端对cxf服务器的访问及常见有关问题

2012-07-16 
axis和cxf客户端对cxf服务器的访问及常见问题?上一篇博客简单介绍了axis2和CXF客户端axis2服务端的访问,包

axis和cxf客户端对cxf服务器的访问及常见问题

?上一篇博客简单介绍了axis2和CXF客户端axis2服务端的访问,包括复杂类型的访问如传递对象参数。本篇博客在前一篇的基础上进一步详解axis和CXF对CXF服务端的访问,并介绍常见的错误及原因。

本章介绍axis和cxf客户端对cxf服务端的访问

首先介绍服务端的代码结构;
建立包文件
:com.demo

所用到得java类

HelloWorld.java(接口)

HelloWorldImpl.java(实现)

User.java(用到得bean)

将三个类放在包中

axis客户端调用服务:

首先客户端需要分析wsdl文件通过“http://**/service/HelloWorld?wsdl”访问

建立用到的User类并且要建立同样的包结构如服务端,包结构即wsdl中targetNamespace的值

客户端:com.demo? 放入User类

调用服务的代码:介绍rpc调用方式

??RPCServiceClient serviceClient = new RPCServiceClient();
??Options options = serviceClient.getOptions();
??// 指定调用WebService 的URL
??EndpointReference targetEPR = new EndpointReference("http://127.0.0.1:8088/*/webservices/HelloWorld");
??options.setTo(targetEPR);
??// 指定访问 方法的参数值
??Object[] opAddEntryArgs = new Object[] { "fei" };
??// 指定访问 方法返回值的数据类型的Class 对象
??Class[] classes = new Class[] { String.class };
??// 指定要调用的方法及WSDL 文件的命名空间
??// QName 第一个参数为命名空间即文件中xschema中targetnamespace的值
??QName opAddEntry = new QName("http://demo.com/", "方法名称");
??// 调用访问 方法并输出该方法的返回值
??System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[0]);
??QName name1 = new QName("http://demo.com/", "方法名称");
??User user = new User(“姓名”,年龄);

??Object[] object = new Object[] { user };
??Class[] classes1 = new Class[] { String.class };
??System.out.println(serviceClient.invokeBlocking(name1, object, classes1)[0]);

运行程序,便可成功访问

这里要强调,service端不可以用webservice的相关注解,如WebMethod,Webresult,Webparam等注解。否则会出现unexpected element (uri:"", local:"args0").错误

另外如果包结构不对会出现http://unknown.namespace/}的错误

CXF客户端的访问:

同样CXF的客户端包结构要与服务端的一致。首先在获取wsdl文件,分析文件,建立自己的包装bean

如建立IHelloWorld接口包装HelloWorld接口。只是将所有的方法声明一下。如果服务端使用了如WebMethod,Webresult,Webparam等注解那么包装bean同样要声明。

客户端访问服务的代码如下:

??JaxWsProxyFactoryBean factory1 = new JaxWsProxyFactoryBean();
??factory1.setServiceClass(IHelloWorld.class);
??factory1.setAddress("http://127.0.0.1:8088/*/webservices/HelloWorld");
??QName qName1 = new QName("http://demo.com/");
??factory1.setServiceName(qName1);
??IHelloWorld service = (IHelloWorld) factory1.create();
??System.out.println(service.方法("参数"));
??User user = new User();
??user.setAge(25);
??user.setName("fei");
??System.out.println(service.方法(user));

1 楼 LeamenLi 19 小时前   "这里要强调,service端不可以用webservice的相关注解,如WebMethod,Webresult,Webparam等注解。否则会出现unexpected element (uri:"", local:"args0").错误"

你好,请问这个问题现在有没有解决方案呢?如果我确实需要加上@WebParam的注解,有没有其他方法可以避免出错呢? 2 楼 wanghuanqiu 19 小时前   LeamenLi 写道"这里要强调,service端不可以用webservice的相关注解,如WebMethod,Webresult,Webparam等注解。否则会出现unexpected element (uri:"", local:"args0").错误"

你好,请问这个问题现在有没有解决方案呢?如果我确实需要加上@WebParam的注解,有没有其他方法可以避免出错呢?
我觉得正常是不会出现这种问题的,但是确实遇到了。你也可以用call的方式试试,或者用wsdltojava工具生成代码。你自己试一下,我不知道是不是我哪个地方弄错了 3 楼 LeamenLi 16 小时前   @WebParame 还是挺有用的,打开wsdl文件查看调用方法的参数时如果只有一堆 arg0,arg1 确实让人头疼的。 axis2在这方面确实做得不好,这些东西是很基本的,它没有很好地支持。我现在改用CXF 来调用就没有这个问题了。 4 楼 wanghuanqiu 17 分钟前   LeamenLi 写道@WebParame 还是挺有用的,打开wsdl文件查看调用方法的参数时如果只有一堆 arg0,arg1 确实让人头疼的。 axis2在这方面确实做得不好,这些东西是很基本的,它没有很好地支持。我现在改用CXF 来调用就没有这个问题了。
axis2应该可以在返回的报文中,修改参数名称

热点排行