隨筆-124  評論-194  文章-0  trackbacks-0
          最近想用PERL通過SOAP與JAVA通信,想到了XFIRE,現在叫CXF提供的服務。但總是差一點成功。

          第一步,
          由于用了SPRING,所以最先看了這篇文章:Writing a service with Spring
          服務是建成功了,PERL和JAVA是可以正常通信了,詳見上篇文章
          可是CXF自己的CLIENT生成代碼卻訪問“自定義結構數組”的函數不成功:
           public List<DeviceValue> sendAlarmArr (List<DeviceValue> arr);

          第二步,
          左試右試不成功,甚至去試了Axis2,但那個生成的WSDL把上面的結構變成AnyType,估計不對。
          又回來,看了Aegis綁定,我還找到將它用到SPRING里的方法:
          <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jaxws
          ="http://cxf.apache.org/jaxws"
           xsi:schemaLocation
          ="
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
           http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
          >

           
          <import resource="classpath:META-INF/cxf/cxf.xml" />
           
          <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
           
          <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

             
          <bean id="serviceClass" class="com.exchangebit.nms.magic.NotifyServiceImpl"/>
            
              
          <bean id="aegisDatabinding" class="org.apache.cxf.aegis.databinding.AegisDatabinding"/>
                    
              
          <bean id="serviceFactory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean">
                  
          <property name="dataBinding" ref="aegisDatabinding"/>
              
          </bean>
              
              
          <bean id="serverBeanFactory" class="org.apache.cxf.frontend.ServerFactoryBean" init-method="create">
                  
          <property name="address" value="/NotifyService"/>
                  
          <property name="bindingId" value="http://schemas.xmlsoap.org/soap/"/>
                  
          <property name="serviceBean" ref="serviceClass"/>
                  
          <property name="serviceFactory" ref="serviceFactory"/>
              
          </bean>

              
          <jaxws:endpoint 
                
          id="notifyService" 
                implementor
          ="com.exchangebit.nms.magic.NotifyServiceImpl" 
                address
          ="/NotifyService">
                   
          <!--jaxws:serviceFactory>
                      <ref bean="serviceFactory"/>
                   </jaxws:serviceFactory
          -->
               
          </jaxws:endpoint>
             
          </beans>


          其實,跟前一種JAX-WS的方式轉換非常簡單,把其中的注釋去掉就是Aegis綁定,注釋掉就是JAX-WS。
          客戶端沒有在SPRING里試成功,但寫代碼也相當簡單,Aegis真好:
                  getBean ("notifyClient");
                  
                  ClientProxyFactoryBean factory 
          = new ClientProxyFactoryBean();
                  factory.setServiceClass(NotifyService.
          class);
                  factory.setAddress(
          "http://127.0.0.1:8080/ebnms/NotifyService");
                  factory.getServiceFactory().setDataBinding(
          new AegisDatabinding());
                  NotifyService client 
          = (NotifyService) factory.create();
                  DoTest (client);


          這次,到是CXF的SERVER和CLIENT都可以正常通信了。但我不說也知道啦,PERL又出問題了!

           

          第三步,
          又進一步搜,才知道Document, Literal, RPC, Encoding對SOAP消息的影響,這篇文章(中文的)相當好!
          大義是RPC/Encoding將方法名稱放入了operation節中,并且消息里含有類型信息,不方便檢驗。
          而Document/Literal通過增加WSDL復雜度,將方法名、參數類型全部放入了types一節,方便了處理。
          而SOAP::Lite只支持RPC/Encoding的方式,但也有辦法讓它形成Doc/Lit的消息:點這里
          但,這種方法只支持JAX-WS的服務,Aegis的PERL就會出錯了。

          所以,不管用哪種要么JAVA的CLIENT和SERVER通信有問題,不然就是把PERL拒之門外。我懷疑是不是CXF的JAX-WS的數組處理有問題,不然Aegis為何不出錯?另外,Aegis對PERL的消息不夠寬容,本已是Doc/Lit格式,只是帶有TYPE信息也會出錯。
          不知如何解,先記在此,以后回過頭來再研究了。
          posted on 2007-08-07 21:39 我愛佳娃 閱讀(2925) 評論(1)  編輯  收藏 所屬分類: Perlweb技術

          評論:
          # re: CXF:咋總差一點呢? 2011-05-10 22:58 | lty
          請問您cxf返回復雜類型怎么做呢?  回復  更多評論
            
          主站蜘蛛池模板: 秦安县| 渝北区| 汕尾市| 兰溪市| 酉阳| 年辖:市辖区| 台东市| 湖北省| 纳雍县| 永昌县| 如皋市| 潜江市| 海口市| 三台县| 远安县| 封开县| 仁寿县| 平湖市| 全椒县| 郎溪县| 大同县| 玉溪市| 石台县| 怀来县| 揭东县| 合作市| 勐海县| 仪征市| 碌曲县| 肥东县| 卓尼县| 万荣县| 兴山县| 江油市| 青铜峡市| 新野县| 惠来县| 灌阳县| 达州市| 阆中市| 龙山县|