深入剖析Axis2中返回值为复杂自定义类型值【步步逼近实践篇】

标签: axis2 复杂 定义 | 发表时间:2012-12-24 08:31 | 作者:llhhyy1989
出处:http://blog.csdn.net
  问:Axis2中到底能否传递复杂以及自定义对象?
  答:肯定可以
 
  那如何传递呢?在开发过程中,基本类型已经不能满足要求。所以才有有相应的List,Map,以及User对象,Dog对象等等。
  比如传递User对象,我们想象一下,到底我们该怎么样,把这个对象传递过去呢?我们再根据前面讲的Webservice传递协议,该如何办呢?实际上发给服务器中是怎么样的格式呢?
  在做Webservice时,肯定很好奇,到底这个东东是如何传递过去的?就宛如,我们学计算机时,计算机处理的信息全部都是二进制,当我们问那图片,视频,怎么运作的在计算机?老师统统告是二进制。虽然我们知道二进制是0011这种形式,但是不是仍然有种想钻到计算机中,探个究竟,想真实的体会,或亲眼见识一下?
  所以呢,把抽象的东西具体化,在真实的环境中再现,这样才能深入理解其中的原理。

  那我们前面也说过,我们传入一个参数为int的方法,其实就是一段soap消息。那一个我们自定义对象,是如何传递呢?User对象在生成的wsdl中,其实是这样的一段代码:
 
<xs:complexType name="User">
<xs:sequence>
  <xs:element minOccurs="0" name="age" typke="xs:int" />
  <xs:element minOccurs="0" name="id" type="xs:long" />
  <xs:element minOccurs="0" name="name" nillable="true" type="xs:string" />
</xs:sequence>
  </xs:complexType>
   再复杂的对象,实际上也是有基本类型组成。那我们看一下再调用时,传递的soap消息是如何的?
  那接下来进入我们的正题,对于复杂类型参数传递。
  我们实际上使用axiom方式调用服务。这种方式,同时也是Axis2的不同于Axis的一个新特性。
  首先我们拿一个例子做测试,深入剖析返回内部的传递。
  第一:测试返回值为自定义对象User对象。
  服务器端,还是按照上传的文档开发。方法如下:
 
 public User getUser()
     {
           User u= new User();
           u.setId(100);
           u.setName( "123ee");
            return u;
     }
  那客户端调用方式如下:
 
      public static void main(String[] args) throws Exception {
          EndpointReference targetEPR = new EndpointReference("http://localhost:8080/testWSServerByAxis2/services/myService?wsdl" );
     try {
                Options options = new Options();
                options.setTo(targetEPR);
           
                 //加载目标服务器
                ServiceClient sender = new ServiceClient();
                sender.setOptions(options);
      
                OMFactory fac = OMAbstractFactory.getOMFactory();
                OMNamespace omNs = fac.createOMNamespace("http://test.com" , "" );
                 //调用服务端的方法
                OMElement method = fac.createOMElement("getUser" , omNs);
                 //给方法赋值参数值
                 //method.addChild(sayHello);
                 //返回OMElement对象
                OMElement result = sender.sendReceive(method);
                System. out.println( "clientResult="+result);
                 Iterator iterator=result.getChildElements();
                 while(iterator.hasNext()){
                     System. out.println( "ok");
                     OMNode omNode = (OMNode) iterator.next();
                      if(omNode.getType()==omNode. ELEMENT_NODE){
                           OMElement omElement = (OMElement) omNode;
                          System. out.println( "***="+omElement.getLocalName());
                            if (omElement.getLocalName().toLowerCase().equals("return" )) {
                                User u = (User) BeanUtil.processObject(omElement, User. class, null, true, new DefaultObjectSupplier());
                                System. out.println(u.getName());
                           }
                     }
                }
           } catch (Exception e) {
                e.printStackTrace();
           }
     }
 那给大家看一下,客户端调用服务器端的getUser方法,返回来的是个OMElement对象。在上篇博客中的RPC调用方式中,直接返回的是无法转化User对象,提示OmElement对象无法转化成User对象。
 好,我们看一下, 服务器给客户端返回的是什么?注意这句代码的输出:
 
System. out.println( "clientResult="+result);
 clientResult=<ns:getUserResponse xmlns:ns="http://test.com"><ns:return xmlns:ax21="http://entity.com/xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ax21:User"><ax21:age>0</ax21:age><ax21:id>100</ax21:id><ax21:name>123ee</ax21:name></ns:return></ns:getUserResponse>
  返回值是个soap消息,soap消息怎么会这样呢?为何不是那样的呢?他是根据什么来呢?为何是"http://test.com",又为何是ax21?大家对输出的信息是否也感到好奇呢?的确,我开始也是很好奇,那请跟着我的思路走,慢慢寻找答案。
 咦,突然发现http://test.com跟代码中的fac.createOMNamespace("http://test.com" , "" );有关联,哦,原来是命名空间呢。说道命名空间,不知道大家是否有点明白?嘻嘻,命名空间是从哪里来?是从wsdl来啊?对,返回的soap消息格式是根据服务端的wsdl信息生成的。那我们在仔细研究一下我们服务端生成的wsdl。
 wsdl截取了重要的一部分,跟大家解释一下其中的关键处。
 
   通过wsdl,我们就稍微明白服务器返回值信息。

    那下一步就是如何从返回值soap信息中抽取想要的User对象?
   其实我们就想要返回值信息中age,id信息。那我们脑子中第一个想法是什么呢?我们该如何取到呢?
   好,也许我们第一反应是,解析xml。类似java中的dom方式,解析xml。然后把相应的值,再拼接成User对象。
   恭喜你。答对了,思路确实如此的。
   但是,Axiom方式,不用我们一个个解析,然后自己去拼接。在Axiom中,自动会跟我们拼接成相应的对象,只要你告诉Axiom从哪到哪拼接完毕即可。
   继续观察服务器给我们返回的信息,看一下,我们想从那拼接成User对象?
   实际上,我们是想把<ax21:age>0</ax21:age><ax21:id>100</ax21:id><ax21:name>123ee</ax21:name>放到一个User对象中,可是Axiom是需要把一个整体标签中的东西封装,是寻找一个大标签,然后把其中的信息打包成用户想要的对象。而不是一个个查找。
   这样的话,应该是这个User信息的外边一层标签。就是<ns:return></ns:return>

   若是明白这个道理的话,那么我们Axiom方式调用就理解了。
   User u = (User) BeanUtil. processObject(omElement, User.  classnulltruenew DefaultObjectSupplier());
   
   OK,讲到这,不知是否明白其中的原理了?若是懂这个例子的话,那么返回值是List<User>也是很简单了,直接用List.add(u)即可。然后返回值为list就有了。
   这节课讲的是返回值为List对象,这样的话,服务器端不用改动。客户端调用方式不使用RPC方式,而是使用Axiom,当然这种肯定也支持RPC支持的基本类型。那下节课给大家深入讲解传递参数为复杂定义类型。

作者:llhhyy1989 发表于2012-12-24 8:31:03 原文链接
阅读:0 评论:0 查看评论

相关 [axis2 复杂 定义] 推荐:

深入剖析Axis2中返回值为复杂自定义类型值【步步逼近实践篇】

- - CSDN博客推荐文章
  问:Axis2中到底能否传递复杂以及自定义对象. 在开发过程中,基本类型已经不能满足要求. 所以才有有相应的List,Map,以及User对象,Dog对象等等.   比如传递User对象,我们想象一下,到底我们该怎么样,把这个对象传递过去呢. 我们再根据前面讲的Webservice传递协议,该如何办呢.

[转]如何正确地在Axis、Axis2和Apache CXF之间抉择?

- - 小鸥的博客
新一代的 Web Services 框架如 Axis2、CXF 都是由现有的项目中逐渐演化而来的,Axis2 是由大家熟悉的 Axis 1.x 系列演化过来,而 Apache CXF 则是由 Celtix 和 XFire 项目整合而生,并且刚刚发布了 2.0.2 的最新版本,不过仍是 Apache 的一个孵化项目.

Axis2-1.6.2 HTTPS/SSL非常慢,解决思路

- - 编程语言 - ITeye博客
最近有个项目需要由axis1.4升级到axis2-1.6.2,原因是由于axis1版本无法控制连接超时时间,只支持设置readtimeout.故需要升级. 服务器是Windows 2008 R2 + IIS+ C#,SSL双向认证 . 客户端是Windows 7 + Axis2-1.6.2. 项目是基于HTTPS访问Web service,axis1连接正常,速度正常,升级到axis2后.

微信有多复杂?

- - 最新更新 – Solidot
腾讯旗下的微信从一个通信工具变成了一个庞大的平台,那么这个平台究竟有多复杂. 它的开发者写的论文 透露了部分细节:微信的后端包含了 3000 多个移动服务,包括即时通讯、社交网络、移动支付和第三方授权. 每天的外部请求有 10^10-10^11 个,每一个请求都能触发更多的内部微服务请求. 总体上说微信后端每秒需要处理数亿的请求.

【外刊IT评论】复杂是大敌

- Keen - 外刊IT评论
本文是从 Complexity is the enemy 这篇文章翻译而来. 差不多在Google工作有7个年头了(!). 我在这学到了很多东西,写都写不完. 然而不管怎样,我至少要向你们分享一条只有在我有了更多经验后才得到的东西. 你无法用数字评估它所造成的代价,它会悄悄慢慢的出现,就像是用小火在煮你,让软件变得越来越糟,你很难察觉到,而当你察觉到时,那已经太晚了.

EXT.NET复杂布局(二)——报表

- 華 - 博客园-首页原创精华区
前面提到过工作台(《EXT.NET复杂布局(一)——工作台》)了,不知道各位看过之后有什么感想. 这次就介绍介绍使用EXT.NET画几个报表. 看图写作从小学就开始了,如图:. 各位看官,不要以为这报表画起来很难,其实使用EXT.NET来画的话,还是挺简单方便的. 这个报表实现,本人采用的是最原始的手写代码(之所以这么说,是因为没怎么偷懒,老老实实的写的,因为这是刚接触EXT.NET的时候画的).

放弃复杂对焦方式

- liangges - 摄影之友
单点对焦是最基础的对焦方式,只要掌握以下拍摄技巧,只用单点对焦,也能搞定风光、人像、静物三大经典场景中的对焦问题.. 在拍摄风光时,我们基本上都是利用三脚架确定构图后再拍摄,这时选择单点自动对焦是方便操作的办法. 当我们需要使用大光圈利用浅景深来突出花朵、树木等主体时,即使是完全相同的构图,由于焦点的不同也可得到画面风格、主题思想等完全不同的2张作品.

把复杂事物简明化

- 勇丞 - 左岸读书_blog
管理就是把复杂的问题简单化,混乱的事情规范化. 最容易不过的是忙碌,最难不过的是有成效地工作. 而化繁为简、善于把复杂的事物简明化,是防止忙乱、事半功倍的法宝. 工作中,我们经常看到有的人善于把复杂的事物简明化,办事又快又好,效率高;而有的人却把简单的事情复杂化,迷惑于复杂纷繁的现象之中,使复杂的事物更复 杂,结果只能陷入其中走不出来,工作忙乱被动,办事效率极低.

Google 复杂的招聘流程

- Desmond - 爱范儿 · Beats of Bits
去 Google 工作想必是许多人的梦想. 还记得以前有位老兄 Matthew Epstein 吗. 他专门制作了一个 googlepleasehireme 网站,想以此混进 Google. 虽然 Techcrunch 的编辑好心的预言他会被雇佣,但最终结果还是碰了壁. Google 之所以有吸引力不仅因为它的庞大,它的野心和梦想,而且因为那里的环境非常人性化.

Eclipse:使用Metrics 测量复杂度

- - CSDN博客推荐文章
Metrics可以进行许多有用的代码度量,包括圈复杂度度量,它用于测量方法中惟一路径的数目. 在Eclipse中安装和使用Metrics步骤 . Elipse中安装Metrics插件 . 打开Help->Install new Software,点击Add,添加Repository. 选择相应的版本插件,继续随后的安装 .