隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0

          導航

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          公告

          關注我的新浪微博

          我的著作









          常用鏈接

          留言簿(126)

          我參與的團隊

          隨筆分類(818)

          隨筆檔案(310)

          文章分類(1)

          文章檔案(8)

          相冊

          ADSL、3G查詢

          CSDN

          eclipse

          ibm

          Java EE

          Linux

          Web

          云服務

          代理網(wǎng)站

          關注的網(wǎng)站

          協(xié)議

          喜歡的Blog

          國內(nèi)廣告平臺

          圖書出版

          在線培訓

          開發(fā)工具

          微博客戶端

          手機鈴聲

          操作系統(tǒng)

          • ReactOS
          • 一個與windowXP/2003兼容的操作系統(tǒng)

          數(shù)學

          文件格式

          源碼資源

          移動(Mobile)

          編程語言

          英語學習

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 1973267
          • 排名 - 6

          最新評論

          閱讀排行榜

          評論排行榜

          WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞

          本文為原創(chuàng),如需轉載,請注明作者和出處,謝謝!

          上一篇:WebService大講堂之Axis2(1):用POJO實現(xiàn)0配置的WebService

              在實際的應用中,不僅需要使用WebService來傳遞簡單類型的數(shù)據(jù),有時也需要傳遞更復雜的數(shù)據(jù),這些數(shù)據(jù)可以被稱為復合類型的數(shù)據(jù)。數(shù)組與類(接口)是比較常用的復合類型。在Axis2中可以直接使用將WebService方法的參數(shù)或返回值類型聲明成數(shù)組或類(接口)。但要注意,在定義數(shù)組類型時只能使用一維數(shù)組,如果想傳遞多維數(shù)組,可以使用分隔符進行分隔,如下面的代碼所示:

          String[] strArray = new String[]{ "自行車,飛機,火箭","中國,美國,德國", "超人,蜘蛛俠,鋼鐵俠" } ;

              上面的代碼可以看作是一個3*3的二維數(shù)組。

              在傳遞類的對象實例時,除了直接將數(shù)組類型聲明成相應的類或接口,也可以將對象實例進行序列化,也就是說,將一個對象實例轉換成字節(jié)數(shù)組進行傳遞,然后接收方再進行反序列化,還原這個對象實例。

              下面的示例代碼演示了如何傳遞數(shù)組與類(接口)類型的數(shù)據(jù),并演示如何使用字節(jié)數(shù)組上傳圖像。本示例的客戶端代碼使用JavaC#編寫。要完成這個例子需要如下幾步:

          一、實現(xiàn)服務端代碼

              ComplexTypeService是一個WebService類,該類的代碼如下:

          import java.io.FileOutputStream;
          import data.DataForm;

          public class ComplexTypeService
          {
              
          //  上傳圖像,imageByte參數(shù)表示上傳圖像文件的字節(jié),
              
          //  length參數(shù)表示圖像文件的字節(jié)長度(該參數(shù)值可能小于imageByte的數(shù)組長度)
              public boolean uploadImageWithByte(byte[] imageByte, int length)
              {
                  FileOutputStream fos 
          = null;
                  
          try
                  {
                      
          //  將上傳的圖像保存在D盤的test1.jpg文件中
                      fos = new FileOutputStream("d:\\test1.jpg");
                      
          //  開始寫入圖像文件的字節(jié)
                      fos.write(imageByte, 0, length);
                      fos.close();
                  }
                  
          catch (Exception e)
                  {
                      
          return false;
                  }
                  
          finally
                  {
                      
          if (fos != null)
                      {
                          
          try
                          {
                              fos.close();
                          }
                          
          catch (Exception e)
                          {

                          }
                      }
                  }
                  
          return true;
              }
              
          //  返回一維字符串數(shù)組
              public String[] getArray()
              {
                  String[] strArray 
          = new String[]{ "自行車""飛機""火箭" };
                  
          return strArray;
              } 
              
          //  返回二維字符串數(shù)組
              public String[] getMDArray()
              {
                  String[] strArray 
          = new String[]{ "自行車,飛機,火箭","中國,美國,德國""超人,蜘蛛俠,鋼鐵俠" } ;
                  
          return strArray;
              }
              
          //  返回DataForm類的對象實例
              public DataForm getDataForm()
              {
                  
          return new DataForm();
              }
              
          //  將DataForm類的對象實例序列化,并返回序列化后的字節(jié)數(shù)組
              public byte[] getDataFormBytes() throws Exception 
              {
                  java.io.ByteArrayOutputStream baos 
          = new java.io.ByteArrayOutputStream();
                  java.io.ObjectOutputStream oos 
          = new java.io.ObjectOutputStream(baos);
                  oos.writeObject(
          new DataForm());        
                  
          return baos.toByteArray();
              }    
          }

           

          二、實現(xiàn)DataForm

              DataForm是要返回的對象實例所對應的類,該類的實現(xiàn)代碼如下:

          package data;

          public class DataForm implements java.io.Serializable
          {
              
          private String name = "bill";
              
          private int age = 20;

              
          public String getName()
              {
                  
          return name;
              }
              
          public void setName(String name)
              {
                  
          this.name = name;
              }
              
          public int getAge()
              {
                  
          return age;
              }
              
          public void setAge(int age)
              {
                  
          this.age = age;
              }
          }

          三、發(fā)布WebService

              由于本示例的WebService類使用了一個Java類(DataForm類),因此,在發(fā)布WebService之前,需要先將DataForm.class文件復制到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\classes\data目錄中,然后將ComplexTypeService.class文件復制到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\pojo目錄中,最后啟動Tomcat(如果Tomcat已經(jīng)啟動,由于增加了一個DataForm類,因此,需要重新啟動Tomcat)。

          四、使用Java編寫調用WebService的客戶端代碼

              在客戶端仍然使用了RPC的調用方式,代碼如下:

          package client;

          import javax.xml.namespace.QName;
          import org.apache.axis2.addressing.EndpointReference;
          import org.apache.axis2.client.Options;
          import org.apache.axis2.rpc.client.RPCServiceClient;

          public class ComplexTypeRPCClient
          {

              
          public static void main(String[] args) throws Exception
              {
                  RPCServiceClient serviceClient 
          = new RPCServiceClient();
                  Options options 
          = serviceClient.getOptions();
                  EndpointReference targetEPR 
          = new EndpointReference(
                          
          "http://localhost:8080/axis2/services/ComplexTypeService");
                  options.setTo(targetEPR);
                  
          // 下面的代碼調用uploadImageWithByte方法上傳圖像文件
                  /////////////////////////////////////////
                  
          // 打開圖像文件,確定圖像文件的大小
                  java.io.File file = new java.io.File("f:\\images.jpg");
                  java.io.FileInputStream fis 
          = new java.io.FileInputStream("f:\\images.jpg");
                  
          // 創(chuàng)建保存要上傳的圖像文件內(nèi)容的字節(jié)數(shù)組
                  byte[] buffer = new byte[(int) file.length()];
                  
          // 將圖像文件的內(nèi)容讀取buffer數(shù)組中
                  int n = fis.read(buffer);
                  System.out.println(
          "文件長度:" + file.length());
                  Object[] opAddEntryArgs 
          = new Object[]{ buffer, n };
                  Class[] classes 
          = new Class[]{ Boolean.class };
                  QName opAddEntry 
          = new QName("http://ws.apache.org/axis2","uploadImageWithByte");
                  fis.close();
                  
          // 開始上傳圖像文件,并輸出uploadImageWithByte方法的返回傳
                  System.out.println(serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs, classes)[0]);
                  
          /////////////////////////////////////////
                  
                  
          // 下面的代碼調用了getArray方法,并返回一維String數(shù)組
                  /////////////////////////////////////////  
                  opAddEntry = new QName("http://ws.apache.org/axis2""getArray");
                  String[] strArray 
          = (String[]) serviceClient.invokeBlocking(opAddEntry,
                                      new
           Object[]{}, new Class[]{String[].class })[0];
                  
          for (String s : strArray)
                      System.out.print(s 
          + "  ");
                  System.out.println();
                  
          ////////////////////////////////////////
                  

                  
          // 下面的代碼調用了getMDArray方法,并返回一維String數(shù)組
                  /////////////////////////////////////////  
                  opAddEntry = new QName("http://ws.apache.org/axis2""getMDArray");
                  strArray 
          = (String[]) serviceClient.invokeBlocking(opAddEntry, new Object[]{},
                                                                    new
           Class[]{String[].class})[0];
                  
          for (String s : strArray)
                  {
                      String[] array 
          = s.split(",");
                      
          for(String ss: array)
                          System.out.print(
          "<" + ss + "");
                      System.out.println();
                  }
                  System.out.println();
                  
          ////////////////////////////////////////

                  
          // 下面的代碼調用了getDataForm方法,并返回DataForm對象實例
                  /////////////////////////////////////////  
                  opAddEntry = new QName("http://ws.apache.org/axis2""getDataForm");
                  data.DataForm df 
          = (data.DataForm) serviceClient.invokeBlocking(opAddEntry, new Object[]{},
                                                                           
          new Class[]{data.DataForm.class})[0];
                  System.out.println(df.getAge());
                  
          /////////////////////////////////////////
                  
                  
          // 下面的代碼調用了getDataFormBytes方法,并返回字節(jié)數(shù)組,最后將返回的字節(jié)數(shù)組反序列化后,轉換成DataForm對象實例
                  /////////////////////////////////////////          
                  opAddEntry = new QName("http://ws.apache.org/axis2""getDataFormBytes");
                  buffer 
          = (byte[]) serviceClient.invokeBlocking(opAddEntry, new Object[]{}, new Class[]{byte[].class})[0];
                  java.io.ObjectInputStream ois 
          = new java.io.ObjectInputStream(
                          
          new java.io.ByteArrayInputStream(buffer));
                  df 
          = (data.DataForm) ois.readObject();
                  System.out.println(df.getName());
                  
          //////////////////////////////////////////
              }
          }

              運行上面的程序,將輸出如下的內(nèi)容:

          文件長度:3617

          true

          自行車 飛機 火箭 

          <自行車> <飛機> <火箭>

          <中國> <美國> <德國>

          <超人> <蜘蛛俠> <鋼鐵俠>

          20

          bill

          五、使用C#編寫調用WebService的客戶端代碼

              Visual Studio中使用WebService就簡單得多。假設引用WebService時的引用名為complexType,則下面的代碼調用了uploadImageWithByte方法來上傳圖像文件。在Visual Studio引用WebService時,uploadImageWithByte方法多了兩個out參數(shù),在使用時要注意。

          complexType.ComplexTypeService cts = new WSC.complexType.ComplexTypeService();
          System.IO.FileStream fs 
          = new System.IO.FileStream(@"f:\images.jpg", System.IO.FileMode.Open);
          byte[] buffer = new byte[fs.Length];
          fs.Read(buffer, 
          0, (int)fs.Length);
          bool r;
          bool rs;
          cts.uploadImageWithByte( buffer, (
          int)fs.Length, trueout r, out rs);

              在獲得二維數(shù)組時,可以將數(shù)據(jù)加載到DataGridView或其他類似的控件中,代碼如下:

          String[] strArray = cts.getMDArray();
          for (int i = 0; i < strArray.Length; i++)
          {
              
          //  用正則表達式將帶分隔符的字符串轉換成String數(shù)組
              String[] columns = strArray[i].Split(',');
              
          //  如果DataGridView的表頭不存在,向DataGridView控件添加三個帶表頭的列
              if (dataGridView1.Columns.Count == 0)
                  
          for (int j = 0; j < columns.Length; j++)
                      dataGridView1.Columns.Add(
          "column" + (j + 1).ToString(), "" + (j + 1).ToString());
              
          //  添加行
              dataGridView1.Rows.Add(1);
              
          for(int j = 0; j < columns.Length; j++)
              {
                  dataGridView1.Rows[i].Cells[j].Value 
          = columns[j];                       
              }                
          }

              DataGridView控件添加數(shù)據(jù)后的效果如圖1所示。



          圖1 

              對于其他的WebService方法的調用都非常簡單,讀者可以自己做這個實驗。

              要注意的是,由于.netjava序列化和反序列化的差異,通過序列化的方式傳遞對象實例只使用于客戶端與服務端為同一種語言或技術的情況,如客戶端和服務端都使用Java來編寫。

              如果讀者要上傳大文件,應盡量使用FTP的方式來傳遞,而只通過WebService方法來傳遞文件名等信息。這樣有助于提高傳輸效率。

          下一篇:WebService大講堂之Axis2(3):使用services.xml文件發(fā)布WebService

           





          Android開發(fā)完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-01-04 23:41 銀河使者 閱讀(27910) 評論(26)  編輯  收藏 所屬分類: java 原創(chuàng)webservice

          評論

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   

          請問一下,JAVA版的客戶端代碼中,調用getDataForm()方法時,data.DataForm 這個對象怎么獲得?因為客戶端 是有沒有這個類的,是否需提前生成,如果生成的話,會根據(jù)不同的編程語言生成不同的類嗎?謝謝。
          2009-02-04 11:34 | robin

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          @robin
          data.DataForm這個類在使用wsdl2java命令生成客戶端的stub類時已自動生成了。我們只要使用就可以了,在內(nèi)部,axis2會將data.DataForm轉換成基于soap協(xié)議的請求和響應消息。這個我們一般不用去管他。就直接將data.DataForm當成本地的類使用即可。不過要注意,不能自己在本地建立個與data.DataForm的內(nèi)容一樣的類,stub只能使用自己生成的類。你可以看一下stub代碼。


          對于本文并未直接使用wsdl2java生成stub代碼,是使用的RPC調用方式,對于這種方式,只要直接將服務端的data.DataForm復制給客戶端即可。客戶端的data.DataForm類就是服務端的data.DataForm類,只要將data.DataForm類同客戶端一定發(fā)布即可。

          你如果用過c#就會看到也是自動生成了相應的data.DataForm類。
          2009-02-04 12:24 | 銀河使者

          # 用wsdl2java調用getDataFormBytes時,怎么轉換?  回復  更多評論   

          ComplexTypeServiceStub st=new ComplexTypeServiceStub();
          ------st.getDataFormBytes().get_return();

          畫線的這行要怎么轉換?謝謝
          2009-02-04 16:24 | zb

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          @zb
          你用wsdl2java試一下就知道了,wsdl2java的用法見《WebService大講堂之Axis2(1):用POJO實現(xiàn)0配置的WebService》

          如果是字節(jié),wsdl2java會使用DataHandler類型處理,詳見我的第四篇關于axis2的文章:

          http://www.aygfsteel.com/nokiaguy/archive/2009/02/archive/2009/01/archive/2009/01/22/252305.html
          2009-02-04 16:41 | 銀河使者

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          謝謝樓主,寫的不錯。支持。
          2009-05-18 13:34 | Harold.Zhang

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   

          如果我要傳入一個DataForm 的數(shù)組或者返回一個DataForm的數(shù)組
          只能使用DataForm[]
          不能使用List<DataForm>??
          2009-07-19 10:14 | frank

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          @frank
          可以使用DataForm,但不能使用List對象。soap協(xié)議不支持List對象。只支持一維數(shù)組。雖然DataForm對象可以發(fā)送,但客戶端無法正確解析成List對象。
          2009-07-19 12:56 | 銀河使者

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          請教下,我只傳了27K的圖象,文件長度為71189就出錯了,為什么呢?
          2009-09-13 12:18 | jackyrong

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          想問個問題,就是我在JAVA版的客戶端代碼中, 對象data.DataForm這個類在使用wsdl2java命令生成客戶端的stub類時已自動生成成功了,但是還是不能識別data.DataForm,不太清楚是為什么,我使用wsdl2java命令生成的stub文件在放在c:\documents and settings\chenf\stub...下面,是不是跟生成的stub class文件的路徑也是有關系的?
          2009-09-14 17:18 | Robber.fei

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   

          老師您好 ,我按照您說的步驟工作,都成功了,但是請問文件上傳到哪里去了呢?在哪里可以看到?謝謝!!!
          2009-11-21 23:10 | 學習者

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          您好,請問WebService支持從客戶端傳遞對象到服務器端嘛?根據(jù)你上面的例子 ,我想從本地構造一個DataForm對象,并在服務端有個接口接收,但當我運行的時候客戶端會拋出一個異常如下:
          org.apache.axis2.AxisFault: The input stream for an incoming message is null.
          at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:92)
          at org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils.java:67)
          at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:354)
          at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)
          at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
          at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
          at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:540)
          at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:521)
          at org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:76)
          at webservice.complexType.object.ComplexTypeTest.testSetDataForm(ComplexTypeTest.java:192)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
          at java.lang.reflect.Method.invoke(Unknown Source)
          at junit.framework.TestCase.runTest(TestCase.java:154)
          at junit.framework.TestCase.runBare(TestCase.java:127)
          at junit.framework.TestResult$1.protect(TestResult.java:106)
          at junit.framework.TestResult.runProtected(TestResult.java:124)
          at junit.framework.TestResult.run(TestResult.java:109)
          at junit.framework.TestCase.run(TestCase.java:118)
          at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
          at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
          從理論上來將,既然可以從客戶端傳遞數(shù)組到服務器端(如上面的上傳功能,已經(jīng)實現(xiàn)),為什么上傳對象時就不行呢?還是哪里需要特殊的配置,請指教,謝謝
          2009-12-31 10:41 | Mr.Blue

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          @學習者
          上傳文件的位置是你在服務端代碼指定了的,比如
          fops = new FileOutputStream("E:\\project\\Axis\\uploadedImg.jpg");服務端程序代碼是這樣指定的那么你就要到E:\\project\\Axis\\找。
          2009-12-31 10:49 | Mr.Blue

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          您好,我又寫了個從客戶端向服務端傳遞對象的序列化數(shù)組的接口,結果從在客戶端進行測試的時候,拋出一下異常,不知所云:
          org.apache.axis2.AxisFault: java.lang.UnsupportedOperationException: An access occurred that is not valid.
          at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:435)
          at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:371)
          at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:417)
          at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
          at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
          at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:540)
          at org.apache.axis2.client.ServiceClient.sendReceive(ServiceClient.java:521)
          at org.apache.axis2.rpc.client.RPCServiceClient.invokeBlocking(RPCServiceClient.java:76)
          at webservice.complexType.object.ComplexTypeTest.testSetDataFormBytes(ComplexTypeTest.java:214)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
          at java.lang.reflect.Method.invoke(Unknown Source)
          at junit.framework.TestCase.runTest(TestCase.java:154)
          at junit.framework.TestCase.runBare(TestCase.java:127)
          at junit.framework.TestResult$1.protect(TestResult.java:106)
          at junit.framework.TestResult.runProtected(TestResult.java:124)
          at junit.framework.TestResult.run(TestResult.java:109)
          at junit.framework.TestCase.run(TestCase.java:118)
          at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
          at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
          at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
          服務端拋出一下異常:
          [ERROR] An access occurred that is not valid.
          java.lang.UnsupportedOperationException: An access occurred that is not valid.
          at org.apache.axis2.description.InOnlyAxisOperation.getMessage(InOnlyAxisOperation.java:117)
          at org.apache.axis2.util.MessageContextBuilder.createOutMessageContext(MessageContextBuilder.java:183)
          at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:37)
          at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
          at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
          at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:167)
          at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
          at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
          at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
          at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
          at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
          at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
          at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
          at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
          at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
          at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
          at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
          at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
          at java.lang.Thread.run(Thread.java:619)
          2009-12-31 11:33 | Mr.Blue

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          因為看到data.DataForm 這個對象怎么獲得?所以我進行了下嘗試。發(fā)現(xiàn)ComplexTypeServiceStub類中確實有 public static class DataForm
          implements org.apache.axis2.databinding.ADBBean這個對象。之后我利用STUB來進行了測試。發(fā)現(xiàn)ComplexTypeServiceStub stub = new ComplexTypeServiceStub();方式得不到服務器端DataForm的初始值。服務器代碼全和本文一樣。
          ComplexTypeServiceStub.DataForm df = new ComplexTypeServiceStub.DataForm() ;
          //df.setName("比爾");//只有在這里進行賦值才能打印出東西,要不然為NULL
          System.out.println( "Name : " + df.getName());
          問題:如何能得到服務器端的初始值?
          2010-03-11 10:42 | 牛肉干

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          ComplexTypeServiceStub.DataForm df = stub.getDataForm().get_return();
          System.out.println( "Name2 : " + df.getName());
          我找到問題了~呵呵~~這樣就可以啦~
          2010-03-11 10:49 | 牛肉干

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          老師,在服務器端生成ComplexTypeService的class文件的時候,需要用到DataForm類。我用javac命令進行編譯,出錯?然后用eclipse建工程,但是在ComplexTypeService類中需要用到import,但是用pojo方式發(fā)布服務又不能用import。這個問題怎么解決???謝謝了
          2010-07-15 11:07 | 張路

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          知道了 要把ComplexTypeService.java,放在data目錄下面,然后用javac來編譯 謝謝博主
          2010-07-15 13:43 | 張路

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   

          您好,您的博客對我學習webservice很有幫助,現(xiàn)在有個問題想請教下,我需要用call方法去訪問一個url,同時返回內(nèi)容,然后把這個類方法,做成webservice方法,該怎么辦?
          2011-08-04 15:40 | sam wang

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   




          public class GetService{


          public String shuzi(String oo){
          String s="9999";
          return s;
          }

          public String getinfomatiom(String no)throws

          MalformedURLException,ServiceException,RemoteException{

          String res=null;
          try{
          String url="xxxxx",username="dddd",password="tttt";
          Service service=new Service();
          Call call=(Call) service.creatCall();
          call.setTargetEndpointAddress(new java.net.URL(url));
          call.addHeader(new SOAPHeaderElement("Authorization","username",username));
          call.addHeader(new SOAPHeaderElement("Authorization","password",password));
          call.setOperationName("invoke");

          res=call.invoke(new Object[]{
          "服務端請求地址",
          "對應服務名稱",
          xml格式傳輸參數(shù)no});

          }
          catch(Eception e){
          e.printStackTrace();
          }
          finally{}
          return res;
          }

          }
          這個是我寫的,有兩個方法,一個是shuzi,就返回9999,
          另一個getinfomation,返回另外一個url得到的數(shù)據(jù)
          發(fā)布之后,調用shuzi函數(shù)可以得到9999,但是get函數(shù)出錯,請問事什么問題/謝謝
          2011-08-04 16:38 | sam wang

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          太感謝了
          正在學習這個東西
          好方便啊!!
          謝謝
          2011-09-14 14:10 | ybren

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          寫的真好,牛人
          2013-03-05 15:00 | ctaodream

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   

          你好 ! 我在寫 RPCServiceClient serviceClient = new RPCServiceClient();時 報 The type java.rmi.RemoteException cannot be resolved. It is indirectly referenced from required .class files 錯誤,。如果屏蔽掉這句就沒有錯了, 是package包的錯誤, 找了好久找不到什么原因 !!! jar也都導入了。  求幫助啊
          2014-04-14 17:15 | wang

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞[未登錄]  回復  更多評論   

          請問一下,JAVA版的客戶端代碼中,調用getDataForm()方法時,data.DataForm 這個對象怎么獲得?客戶端沒有這個類.。如何通過復制服務器端獲得。我用Eclipse編譯不通過,找不到data.DataForm。
          2014-07-04 10:04 | zhang

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          我的感覺是,對于傳圖片那部分,應該是服務端把圖片上傳,然后客戶端調用,把圖片下載到本地。這樣邏輯才更合理,這樣對嗎?
          2014-07-23 14:37 | yyyyy

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          博主寫的真好,學習了
          不過這里我有一個問題,當我傳new Class[]{String[].class },應該返回一維數(shù)組,可我這里一直返回:[Ljava.lang.String;@18f6235 ,是axis2不識別string[]嗎,請教博主
          2014-10-10 14:38 | 范軍

          # re: WebService大講堂之Axis2(2):復合類型數(shù)據(jù)的傳遞  回復  更多評論   

          我能說的只有一聲謝謝!!
          2014-10-15 19:37 | 程成
          主站蜘蛛池模板: 新化县| 汕头市| 从江县| 新郑市| 清远市| 巨鹿县| 达孜县| 读书| 定南县| 寻甸| 牙克石市| 岑巩县| 吴忠市| 仙游县| 淮阳县| 南澳县| 桃江县| 增城市| 社旗县| 池州市| 沙湾县| 合作市| 澄江县| 正镶白旗| 无极县| 安龙县| 江西省| 察哈| 尖扎县| 华宁县| 准格尔旗| 三穗县| 普陀区| 天柱县| 太谷县| 鄢陵县| 刚察县| 商洛市| 鄂托克前旗| 成安县| 亳州市|