隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

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

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

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

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

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

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

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

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

          一、實現服務端代碼

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

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

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

                          }
                      }
                  }
                  
          return true;
              }
              
          //  返回一維字符串數組
              public String[] getArray()
              {
                  String[] strArray 
          = new String[]{ "自行車""飛機""火箭" };
                  
          return strArray;
              } 
              
          //  返回二維字符串數組
              public String[] getMDArray()
              {
                  String[] strArray 
          = new String[]{ "自行車,飛機,火箭","中國,美國,德國""超人,蜘蛛俠,鋼鐵俠" } ;
                  
          return strArray;
              }
              
          //  返回DataForm類的對象實例
              public DataForm getDataForm()
              {
                  
          return new DataForm();
              }
              
          //  將DataForm類的對象實例序列化,并返回序列化后的字節數組
              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();
              }    
          }

           

          二、實現DataForm

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

          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;
              }
          }

          三、發布WebService

              由于本示例的WebService類使用了一個Java類(DataForm類),因此,在發布WebService之前,需要先將DataForm.class文件復制到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\classes\data目錄中,然后將ComplexTypeService.class文件復制到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\pojo目錄中,最后啟動Tomcat(如果Tomcat已經啟動,由于增加了一個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");
                  
          // 創建保存要上傳的圖像文件內容的字節數組
                  byte[] buffer = new byte[(int) file.length()];
                  
          // 將圖像文件的內容讀取buffer數組中
                  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數組
                  /////////////////////////////////////////  
                  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數組
                  /////////////////////////////////////////  
                  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方法,并返回字節數組,最后將返回的字節數組反序列化后,轉換成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());
                  
          //////////////////////////////////////////
              }
          }

              運行上面的程序,將輸出如下的內容:

          文件長度:3617

          true

          自行車 飛機 火箭 

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

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

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

          20

          bill

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

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

          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);

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

          String[] strArray = cts.getMDArray();
          for (int i = 0; i < strArray.Length; i++)
          {
              
          //  用正則表達式將帶分隔符的字符串轉換成String數組
              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控件添加數據后的效果如圖1所示。



          圖1 

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

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

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

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

           





          Android開發完全講義(第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 原創webservice

          評論

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

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

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

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


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

          你如果用過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):復合類型數據的傳遞  回復  更多評論   

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

          如果是字節,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):復合類型數據的傳遞  回復  更多評論   

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

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

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

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

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

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

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

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

          想問個問題,就是我在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):復合類型數據的傳遞[未登錄]  回復  更多評論   

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

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

          您好,請問WebService支持從客戶端傳遞對象到服務器端嘛?根據你上面的例子 ,我想從本地構造一個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)
          從理論上來將,既然可以從客戶端傳遞數組到服務器端(如上面的上傳功能,已經實現),為什么上傳對象時就不行呢?還是哪里需要特殊的配置,請指教,謝謝
          2009-12-31 10:41 | Mr.Blue

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

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

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

          您好,我又寫了個從客戶端向服務端傳遞對象的序列化數組的接口,結果從在客戶端進行測試的時候,拋出一下異常,不知所云:
          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):復合類型數據的傳遞  回復  更多評論   

          因為看到data.DataForm 這個對象怎么獲得?所以我進行了下嘗試。發現ComplexTypeServiceStub類中確實有 public static class DataForm
          implements org.apache.axis2.databinding.ADBBean這個對象。之后我利用STUB來進行了測試。發現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):復合類型數據的傳遞  回復  更多評論   

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

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

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

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

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

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

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

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




          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格式傳輸參數no});

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

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

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

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

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

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

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

          你好 ! 我在寫 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):復合類型數據的傳遞[未登錄]  回復  更多評論   

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

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

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

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

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

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

          我能說的只有一聲謝謝!!
          2014-10-15 19:37 | 程成
          主站蜘蛛池模板: 沛县| 山阴县| 塔河县| 西畴县| 吴忠市| 肥东县| 白玉县| 烟台市| 蒙自县| 霍山县| 建水县| 松潘县| 广元市| 开远市| 神木县| 盐边县| 禹州市| 望江县| 寻甸| 子长县| 常德市| 五大连池市| 浦城县| 桃园市| 惠来县| 九台市| 芒康县| 嵊泗县| 稻城县| 互助| 惠来县| 台北市| 敖汉旗| 永州市| 岑巩县| 福海县| 孟连| 日土县| 资讯 | 随州市| 淳安县|