隨筆-124  評論-194  文章-0  trackbacks-0
          上一篇文章中的問題,今天又再試了下,居然解決了,看來把遇到問題放一放是有好處的。

          第一,是要用對CXF的庫,在一行代碼未變的情況下,只要使用最新的庫。看來在最新庫里解決了數組問題:
          2.1-incubator-SNAPSHOT
          就沒問題,如果是用:
          2.0-incubator
          就會出現上篇文章的情況。我使用MAVEN2,就寫成:
                <!--for cxf-->
              
          <dependency>
                  
          <groupId>org.apache.cxf</groupId>
                  
          <artifactId>cxf-rt-frontend-jaxws</artifactId>
                  
          <version>2.1-incubator-SNAPSHOT</version>
                  
          <!-- version>2.0-incubator</version-->
              
          </dependency>
              
          <dependency>
                  
          <groupId>org.apache.cxf</groupId>
                  
          <artifactId>cxf-rt-transports-http</artifactId>
                  
          <version>2.1-incubator-SNAPSHOT</version>
              
          </dependency>
              
          <dependency>
                  
          <groupId>org.apache.cxf</groupId>
                  
          <artifactId>cxf-rt-databinding-aegis</artifactId>
                  
          <version>2.1-incubator-SNAPSHOT</version>
              
          </dependency>


          第二,對SOAP::Lite的改變,SOAP::Lite不支持doc/literal,但通過閱讀
          "NET-based Web Service Using the SOAP::Lite Perl Library".
          我的上篇文章有鏈接,我寫的PERL程序在某些情況下依然不行。
          這次再加了兩處改動后就可以了:(注意:CXF里不要使用aegisDatabinding,用默認的即可)
          my $soap = SOAP::Lite
                 
          -> uri('http://magic.nms.exchangebit.com/')
                 
          -> on_action( subjoin '/', 'http://www.alfredbr.com', $_[1] })
                 
          -> proxy('http://127.0.0.1:8080/ebnms/NotifyService')
                     
          ->autotype(0);


          其中的autotype(0)非常重要。另外一處改動是,程序中的根變量名改成"arg0",即與WSDL中定義一致。
          實驗發現,帶不帶attr中的xmlns都可以。完整代碼如下:
           use SOAP::Lite ( +trace => all, maptype => {} );

          my $soap = SOAP::Lite
                 
          -> uri('http://magic.nms.exchangebit.com/')
                 
          -> on_action( subjoin '/', 'http://www.alfredbr.com', $_[1] })
                 
          -> proxy('http://127.0.0.1:8080/ebnms/NotifyService')
                     
          ->autotype(0);

          #$soap->sendAlarmString ("good");

          #$soap->sendAlarm (SOAP::Data->name(arg0=>{devName=>"hehe", devIp=>"ip1"}));


          {
          # call send alarm
              my @params = (
              
          #   $header,
                 SOAP::Data->name(arg0 => goodhehe) 
              );
              
              
          my $method = SOAP::Data->name('ns1:sendAlarmString')
                 
          ->attr({"xmlns:ns1" => 'http://magic.nms.exchangebit.com/'});
              
              
          my $result = $soap->call($method => @params);
              
              
          print "\nsend string alarm result:\n";
              
          if ($result->fault)
              {
                 
          print $result->faultstring;
              }
              
          else
              {
                 
          print $result->result;
              }
              
          print "\nn";
          }

          {
          # call send dev alarm
              my @params = (SOAP::Data->name(arg0=>{devName=>"hehe", devIp=>"ip1"}));
              
              
          my $method = SOAP::Data->name('sendAlarm');
          #       ->attr({"xmlns:ns1" => 'http://magic.nms.exchangebit.com/'});
              
              
          my $result = $soap->call($method => @params);
              
              
          print "\nsend string alarm result:\n";
              
          if ($result->fault)
              {
                 
          print $result->faultstring;
              }
              
          else
              {
                 
          print $result->result;
              }
              
          print "\n\n";
          }

          {
          # call send arr alarm
              my @params = (
                 SOAP
          ::Data->name(arg0 => [
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe1", devIp=>"ip1"}, 
                 {devName
          =>"hehe2", devIp=>"ip2"}])
              );
              
              
          my $method = SOAP::Data->name('sendAlarmArr');
              
              
          my $result = $soap->call($method => @params);
              
              
          print "\nsend string alarm result:\n";
              
          if ($result->fault)
              {
                 
          print $result->faultstring;
              }
              
          else
              {
                 
          my @a = @{$result->result->{item}};
                 
          foreach $i (@a) {
                         
          print "ele: $i->{devName}, $i->{devIp}\n";
                 }
              }
              
          print "\n\n";
          }
          posted on 2007-08-23 14:13 我愛佳娃 閱讀(1446) 評論(1)  編輯  收藏 所屬分類: Perlweb技術

          評論:
          # re: CXF:咋總差一點呢? (續:已解決) 2007-09-04 11:05 | willem
          CXF2.0.1 修復很多 CXF 2.0 的bug,在過一兩個禮拜 CXF2.0.2就要Release了。到時你可以下下來試一下。

          http://cwiki.apache.org/CXF/download.html  回復  更多評論
            
          主站蜘蛛池模板: 汕尾市| 建德市| 娄底市| 隆化县| 嵊泗县| 都安| 侯马市| 宁强县| 上栗县| 太谷县| 红原县| 河间市| 洪泽县| 灵台县| 赣榆县| 祁阳县| 宁南县| 安图县| 平阴县| 樟树市| 花垣县| 清远市| 锦屏县| 呈贡县| 永平县| 文山县| 偃师市| 苍山县| 广饶县| 偏关县| 麦盖提县| 铜山县| 乌兰浩特市| 平度市| 寿阳县| 张掖市| 额尔古纳市| 西华县| 蒲城县| 衡阳县| 阿克陶县|