利用Axis實現基於SOAP的Web Service

簡介

這是一篇用Java不到2周的新手寫的關於利用Axis實現基於SOAPWeb Service的紀實性文章,裏面不敢介紹什麼SOAP,Axis,Web Service之類的理論知識,因爲我至今還不是很懂這些,其中涉及到的你可能感興趣的問題是:

   1.如何用JBuilder 9Web Service的服務器端和客戶端;

   2.如何發佈Web Service;

   3.如何解決Web Service中自定義對象的傳遞問題.

我使用的各個主要開發抱/工具/平臺的情況如下:

       1. JDK 1.4.0.01

       2. JBuilder 9.0

       3. Axis 1.1(past name is Apache SOAP 3.0)

       4. Xerces 2.5.0

       5. Javamail 1.3.1

       6. Jaf 1.0.2

       7. Tomcat 4.1

 

關鍵字 Axis,Web Service,SOAP,JBuilder

 

*爲什麼是Axis而不是Apache SOAP?

 

 我最近跳槽了,在以前的公司莫名的鬱悶了很久,終於是邁出了這一步,新公司用Java,,Java,對我來說用Java是近四年前的事情了,那時候還是JDK1.1.7A,我有些莫名的緊張,剛來接到的活是:”做一個Web Service提供給別人調用”….Web Service,我在Windows平臺上倒是用過,無非是找一個Java世界中的SOAP實現(也就是一個 SOAP Toolkit),然後調用就完了首先我找到的是Apache SOAP 2.2,我滿心歡喜的準備開始了還是等等吧,我勸自己冷靜一點,看看文檔再說於是我泡上一杯茶到http://ws.apache.org/axis/index.html一頓亂看,這一看把我嚇了一跳有文字爲證:

 

     Apache SOAP                   Axis

----------------------------------------------------------------------

     really old                    third generation

     really slow                   much faster, but not as fast as many

     no WSDL support               WSDL support

     proprietary API               JAX-RPC API

     RPC/encoded only              RPC/encoded and Doc/literal

     interoperability issues       very interoperable

     extensiblity issues           very extensible

     low level API for headers     easy handler support for headers

 

上司給我的文檔中提到了WSDL這玩意,而上面的表格說明Apache SOAP就不支持WSDL…很自然我的,我選擇了Axis,我現在對Axis的認識就是:它是Apache SOAP的後續版本,本來是叫Apache SOAP 3.0,但是人家爲了噱一點就去了這個名字.

     AxisApache SOAP都是SOAP協議的實現,但是基於上面提到的理由我選擇了Axis.

 

*安裝和配置Axis

 

這個請參看http://ws.apache.org/axis/index.html上面寫的很詳細,其實Axis的安裝和配置很簡單,apache網站上Down1.1的安裝文件,解壓縮,然後一份拷貝到服務器上,一份拷貝到客戶端,然後就是配置了,最主要的就是環境變量的設置了:

 

    A. Client(Windows 2000/NT/XP)

 

         set AXIS_HOME = c:/axis
         set AXIS_LIB  = %AXIS_HOME%/lib
         set AXISCLASSPATH = %AXIS_LIB%/axis.jar;

                             %AXIS_LIB%/commons-discovery.jar;
                             %AXIS_LIB%/commons-logging.jar;

                             %AXIS_LIB%/jaxrpc.jar;%AXIS_LIB%/saaj.jar;
                             %AXIS_LIB%/log4j-1.2.8.jar;

                             %AXIS_LIB%/xml-apis.jar;

                             %AXIS_LIB%/xercesImpl.jar

 

     B. Server(Unix+Tomcat4.1.X)

 

                    set AXIS_HOME=/usr/axis
         set AXIS_LIB=$AXIS_HOME/lib
         set AXISCLASSPATH=$AXIS_LIB/axis.jar:$AXIS_LIB/commons-discovery.jar:
                           $AXIS_LIB/commons-logging.jar:

                           $AXIS_LIB/jaxrpc.jar:$AXIS_LIB/saaj.jar:
                           $AXIS_LIB/log4j-1.2.8.jar:$AXIS_LIB/xml-apis.jar:

                           $AXIS_LIB/xercesImpl.jar
         export AXIS_HOME;

         export AXIS_LIB; 

         export AXISCLASSPATH

 

環境變量很重要也是很容易搞錯的地方,你可以設置好以後在控制檯下輸入set命令(我假設你此時在Win2000/XP)檢查一下自己的環境變量是否設置正確了像什麼找不到指定類之類的錯誤很可能就是因爲環境變量沒有設置正確,遇到這類問題別急着哭着喊着去csdn貼貼子,檢查自己的環境變量設置先.

 

利用Axis實現基於SOAPWeb Service

 

簡介

這是一篇用Java不到2周的新手寫的關於利用Axis實現基於SOAPWeb Service的紀實性文章,裏面不敢介紹什麼SOAP,Axis,Web Service之類的理論知識,因爲我至今還不是很懂這些,其中涉及到的你可能感興趣的問題是:

   1.如何用JBuilder 9Web Service的服務器端和客戶端;

   2.如何發佈Web Service;

   3.如何解決Web Service中自定義對象的傳遞問題.

我使用的各個主要開發抱/工具/平臺的情況如下:

       1. JDK 1.4.0.01

       2. JBuilder 9.0

       3. Axis 1.1(past name is Apache SOAP 3.0)

       4. Xerces 2.5.0

       5. Javamail 1.3.1

       6. Jaf 1.0.2

       7. Tomcat 4.1

 

關鍵字 Axis,Web Service,SOAP,JBuilder

 

*我要寫的Web Service

 

真的當然不能說,職業道德嘛,所以假設叫CommitOrderReq:

 

     public  ResultInfo CommitOrderReq (OrderFormInfo ofi)

 

這是一個公開給別人提交訂單的Web Service,客戶端要傳給我一個OrderFormInfo對象,這個對象描述了訂單的信息,我返回給客戶端一個ResultInfo對象.下面是OrderFormInfoResultInfo的定義:

 

class OrderFormInfo

{

    public OrderFormInfo( ) { };   // $$$ - 1

   

    String m_strOrderName;

    int      m_nOrderID;

 

    OrderOwner m_objOrderOwner;   // $$$ - 2

 

    String get_OrderName( );

    void   set_OrderName(String strIn);

 

    String get_OrderID( );

    void   set_OrderID(int nIn );

}

 

class ResultInfo

{

    public ResultInfo( ) {  };      // $$$ - 3

 

    String  m_strResult;

  

    String get_Result ( );

    void   set_Result (String strIn);

 

}

 

有兩個地方需要注意的,這兩個類最好遵從JavaBean的規範(“遵從JavaBean的規範”,我甚至都不知道這麼說對不對,呵呵,Java世界還不熟悉見諒呀各位),不遵從的話你到時候會在客戶端傳遞對象給服務器的時候遇到麻煩的,怎麼遵從呢?..就是:

  1.一定要有默認構造函數(就是不帶參數的構造函數),$$$ -1,$$$ -3;

  2.Microsoft COM中的某種屬性一樣針對各個成員變量提供get,set方法.

 

請注意,OrderFormInfo對象裏面又聚合了一個OrderOwner對象,這種樣子參數在實際工作中經常會遇到的情況,一開始我沒有在意這一點,沒覺得有什麼不對後來大家會知道發生了什麼

 

*JBuilder 9寫一個Web Service

  

 File|New,新建一個工程,然後把自己讓Web Service做的事情寫完了其中艱辛就不說了,都不知道該怎麼去查Java那浩瀚的類…Sun要是有MSDN之類的幫助就好了

 

 

*部署Web Service

  

        A.Select File|New Project to display the Project wizard.Select “Web Service” tab and then click “Web Service Configuation”.

        B. Choose Apache Axis from the Toolkit drop-down list,enter ”webApp” in another field;

        C. Select File|New Project to display the Project wizard.Select “Web Service” tab,click “Export as a web service”.

        D.In “Export as a web service – Step 1 of 7wizard click browser-button that belongs to Interface or Class.

        E.In “Choose Class or Intersface to Export As Web Service” dialog,find and select the “firstjavawebservice.HelloAxis” item.It is the class that you want to export as web service.

        F.Run this project,it will display “JBuilder Apache Axis Admin Consolepage,click viewto check whether your web service is successfully deploy on your local tomcat server.You should conform WSDL file also.

        G.Click finish to close the Project wizard.

   

   別以爲這就完了,假設我剛纔我在Step B中填寫的是perdubug_ws,接下來我就把perdubug_ws/WEB-INF目錄下的東西拷貝到服務器上的/Tomcat 4.1/webapps/axis/WEB-INF目錄下,這就算部署了我就很納悶是否JBuilder 9提供了這樣的功能是的我可以直接在本地編譯完我的代碼然後直接部署到遠端的服務器上呢?反正我是沒找到

   部署完了再在瀏覽器裏面輸入http://服務器地址:端口號/axis/,就會出現你的Axis的頁面否這說明你沒有配置好Axis…點擊View看一下你的服務是否部署成功了,如果成功的話你可以看到你的服務名旁邊有一個(WSDL),記下它的URL後面用得到,我們在這稱呼這個URLwsdl_URL,主要是爲了好記.

   

*JBuilder 9寫調用Web Service的客戶端

 

        File|New|Web Service,Import a web service,沒錯,wsdl_URL就是我們要importWSDL,倒入成功後你會看到JBuilder會根據這個WSDL產生幾個文件,這些文件封裝了axisSOAP打交道的細節,你不用再關心什麼call之類的對象了,你幾乎可以把web service當作本地的方法來使用

        然後你再建立一個你的客戶端java文件,如下(其中有看不明白的可以參看axis的例子,比我的詳細多了):

 

   public class ws_invoker {

 

       public static void main(String[] args)

       {

          Perdubug_wsServiceLocator pwsl = new Perdubug_wsServiceLocator();

          OrderFormInfo                   ofi    = new OrderFormInfo ();

          ResultInfo                          ri     = null; 

          Perdubug_ws pw; 

 

          OrderOwner  oo = new OrderOwner();

          oo.set_XXX( );  

          ofi .set_XXX( );

 

          try {

 

             pw   = pwsl.getws_entry();

             ri     = pw.syncOrderRelationReq(ofi);

 

           } catch (Exception e) {

 

               System.out.println("exception: " + e.getMessage());

           }

 

         System.out.println("Result: " + ri.get_XXX()); 

       }

  }

 

*運行客戶端,發生了什麼

 

,一運行JBuilder告訴我說什麼OrderOwner沒有反序列化之類的提示序列化,反序列化我猛差了一陣子資料,覺得不對,這些難道axis沒幫我做了嗎?還需要自己來做嗎??這個問題困擾了幾根菸的時間,是不是所謂的簡單對象存取協議就簡單在這呀?我上google股溝了一下我的問題,發現很多人在討論說要改這個配哪個的鬱悶….

我把OrderOwner相關代碼註釋掉,一運行,就可以也就是說JBuilder或者是Axis沒有把我的OrderOwner正確的序列化導致服務器那邊就不認識我的寶貝OrderOwner對象,解決問題的關鍵在哪呢?我查了一下文檔,說在Tomcat 4.1/webapps/axis/WEB-INF/server-config.wsdd,我們先看一下導致我很煩惱的那個server-config.wsdd的片斷:

 

  <service name="Perdubug_ws" provider="java:RPC">

  <parameter name="allowedMethods" value="*"/>

  <parameter name="scope" value="Request"/>

  <parameter name="className" value="mpeonasia_ws.ws_entry"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns1: OrderformInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java: samsungasia_ws.OrderformInfo"

             xmlns:ns1="http:// samsungasia _ws"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns2: ResultInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. ResultInfo"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

猜都猜得出來typeMapping是用來告訴服務器如何Mapping那些JavaBean類的,我一葫蘆畫瓢手動的添加了OrderOwner:

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns3: OrderOwner"

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. OrderOwner"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

然後在運行我的客戶端,就好了不要以爲我會說什麼我從中得到了什麼經驗之類的話,我只想說:爲什麼JBuilder或者是Axis不把這種事情幫我做了而要我自己來動手?最起碼在編譯服務器端的web service的時候提示一下說:GG,這個類沒有被寫進server-config.wsdd或者在JBuilder裏面增加對server-config.wsdd的配置界面吧.

心情鬱悶,爲了這樣的問題,我花了很多時間看如下電子書:

 

O'Reilly - Java and SOAP.pdf

O'Reilly - Java Web Service.pdf

O'Reilly - Programming Web Services with SOAP.pdf

O'Reilly - Programming Web Services With XML RPC.pdf

 

差一點就因爲這個問題把SOAP的什麼Envelop,Body,Head,PortType…文法和WSDL的文法搞了一遍了,我覺得沒什麼意思,浪費我的時間,我現在事情多的打堆.Java我的感覺就是:可選的方案多的打堆,等你搞明白了這個那個又熱起來了,一堆的人又會對你說,快換吧,那個更爽…..爽什麼呀,還不如我在CSDN亂寫些東西爽別人呢..J

 

 


*JBuilder 9寫調用Web Service的客戶端

 

        File|New|Web Service,Import a web service,沒錯,wsdl_URL就是我們要importWSDL,倒入成功後你會看到JBuilder會根據這個WSDL產生幾個文件,這些文件封裝了axisSOAP打交道的細節,你不用再關心什麼call之類的對象了,你幾乎可以把web service當作本地的方法來使用

        然後你再建立一個你的客戶端java文件,如下(其中有看不明白的可以參看axis的例子,比我的詳細多了):

 

   public class ws_invoker {

 

       public static void main(String[] args)

       {

          Perdubug_wsServiceLocator pwsl = new Perdubug_wsServiceLocator();

          OrderFormInfo                   ofi    = new OrderFormInfo ();

          ResultInfo                          ri     = null; 

          Perdubug_ws pw; 

 

          OrderOwner  oo = new OrderOwner();

          oo.set_XXX( );  

          ofi .set_XXX( );

 

          try {

 

             pw   = pwsl.getws_entry();

             ri     = pw.syncOrderRelationReq(ofi);

 

           } catch (Exception e) {

 

               System.out.println("exception: " + e.getMessage());

           }

 

         System.out.println("Result: " + ri.get_XXX()); 

       }

  }

 

*運行客戶端,發生了什麼

 

,一運行JBuilder告訴我說什麼OrderOwner沒有反序列化之類的提示序列化,反序列化我猛差了一陣子資料,覺得不對,這些難道axis沒幫我做了嗎?還需要自己來做嗎??這個問題困擾了幾根菸的時間,是不是所謂的簡單對象存取協議就簡單在這呀?我上google股溝了一下我的問題,發現很多人在討論說要改這個配哪個的鬱悶….

我把OrderOwner相關代碼註釋掉,一運行,就可以也就是說JBuilder或者是Axis沒有把我的OrderOwner正確的序列化導致服務器那邊就不認識我的寶貝OrderOwner對象,解決問題的關鍵在哪呢?我查了一下文檔,說在Tomcat 4.1/webapps/axis/WEB-INF/server-config.wsdd,我們先看一下導致我很煩惱的那個server-config.wsdd的片斷:

 

  <service name="Perdubug_ws" provider="java:RPC">

  <parameter name="allowedMethods" value="*"/>

  <parameter name="scope" value="Request"/>

  <parameter name="className" value="mpeonasia_ws.ws_entry"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns1: OrderformInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java: samsungasia_ws.OrderformInfo"

             xmlns:ns1="http:// samsungasia _ws"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns2: ResultInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. ResultInfo"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

猜都猜得出來typeMapping是用來告訴服務器如何Mapping那些JavaBean類的,我一葫蘆畫瓢手動的添加了OrderOwner:

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns3: OrderOwner"

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. OrderOwner"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

然後在運行我的客戶端,就好了不要以爲我會說什麼我從中得到了什麼經驗之類的話,我只想說:爲什麼JBuilder或者是Axis不把這種事情幫我做了而要我自己來動手?最起碼在編譯服務器端的web service的時候提示一下說:GG,這個類沒有被寫進server-config.wsdd或者在JBuilder裏面增加對server-config.wsdd的配置界面吧.

心情鬱悶,爲了這樣的問題,我花了很多時間看如下電子書:

 

O'Reilly - Java and SOAP.pdf

O'Reilly - Java Web Service.pdf

O'Reilly - Programming Web Services with SOAP.pdf

O'Reilly - Programming Web Services With XML RPC.pdf

 

差一點就因爲這個問題把SOAP的什麼Envelop,Body,Head,PortType…文法和WSDL的文法搞了一遍了,我覺得沒什麼意思,浪費我的時間,我現在事情多的打堆.Java我的感覺就是:可選的方案多的打堆,等你搞明白了這個那個又熱起來了,一堆的人又會對你說,快換吧,那個更爽…..爽什麼呀,還不如我在CSDN亂寫些東西爽別人呢..J

 


利用Axis實現基於SOAPWeb Service

 

簡介

這是一篇用Java不到2周的新手寫的關於利用Axis實現基於SOAPWeb Service的紀實性文章,裏面不敢介紹什麼SOAP,Axis,Web Service之類的理論知識,因爲我至今還不是很懂這些,其中涉及到的你可能感興趣的問題是:

   1.如何用JBuilder 9Web Service的服務器端和客戶端;

   2.如何發佈Web Service;

   3.如何解決Web Service中自定義對象的傳遞問題.

我使用的各個主要開發抱/工具/平臺的情況如下:

       1. JDK 1.4.0.01

       2. JBuilder 9.0

       3. Axis 1.1(past name is Apache SOAP 3.0)

       4. Xerces 2.5.0

       5. Javamail 1.3.1

       6. Jaf 1.0.2

       7. Tomcat 4.1

 

關鍵字 Axis,Web Service,SOAP,JBuilder

 

*我要寫的Web Service

 

真的當然不能說,職業道德嘛,所以假設叫CommitOrderReq:

 

     public  ResultInfo CommitOrderReq (OrderFormInfo ofi)

 

這是一個公開給別人提交訂單的Web Service,客戶端要傳給我一個OrderFormInfo對象,這個對象描述了訂單的信息,我返回給客戶端一個ResultInfo對象.下面是OrderFormInfoResultInfo的定義:

 

class OrderFormInfo

{

    public OrderFormInfo( ) { };   // $$$ - 1

   

    String m_strOrderName;

    int      m_nOrderID;

 

    OrderOwner m_objOrderOwner;   // $$$ - 2

 

    String get_OrderName( );

    void   set_OrderName(String strIn);

 

    String get_OrderID( );

    void   set_OrderID(int nIn );

}

 

class ResultInfo

{

    public ResultInfo( ) {  };      // $$$ - 3

 

    String  m_strResult;

  

    String get_Result ( );

    void   set_Result (String strIn);

 

}

 

有兩個地方需要注意的,這兩個類最好遵從JavaBean的規範(“遵從JavaBean的規範”,我甚至都不知道這麼說對不對,呵呵,Java世界還不熟悉見諒呀各位),不遵從的話你到時候會在客戶端傳遞對象給服務器的時候遇到麻煩的,怎麼遵從呢?..就是:

  1.一定要有默認構造函數(就是不帶參數的構造函數),$$$ -1,$$$ -3;

  2.Microsoft COM中的某種屬性一樣針對各個成員變量提供get,set方法.

 

請注意,OrderFormInfo對象裏面又聚合了一個OrderOwner對象,這種樣子參數在實際工作中經常會遇到的情況,一開始我沒有在意這一點,沒覺得有什麼不對後來大家會知道發生了什麼

 

*JBuilder 9寫一個Web Service

  

 File|New,新建一個工程,然後把自己讓Web Service做的事情寫完了其中艱辛就不說了,都不知道該怎麼去查Java那浩瀚的類…Sun要是有MSDN之類的幫助就好了

 

 

*部署Web Service

  

        A.Select File|New Project to display the Project wizard.Select “Web Service” tab and then click “Web Service Configuation”.

        B. Choose Apache Axis from the Toolkit drop-down list,enter ”webApp” in another field;

        C. Select File|New Project to display the Project wizard.Select “Web Service” tab,click “Export as a web service”.

        D.In “Export as a web service – Step 1 of 7wizard click browser-button that belongs to Interface or Class.

        E.In “Choose Class or Intersface to Export As Web Service” dialog,find and select the “firstjavawebservice.HelloAxis” item.It is the class that you want to export as web service.

        F.Run this project,it will display “JBuilder Apache Axis Admin Consolepage,click viewto check whether your web service is successfully deploy on your local tomcat server.You should conform WSDL file also.

        G.Click finish to close the Project wizard.

   

   別以爲這就完了,假設我剛纔我在Step B中填寫的是perdubug_ws,接下來我就把perdubug_ws/WEB-INF目錄下的東西拷貝到服務器上的/Tomcat 4.1/webapps/axis/WEB-INF目錄下,這就算部署了我就很納悶是否JBuilder 9提供了這樣的功能是的我可以直接在本地編譯完我的代碼然後直接部署到遠端的服務器上呢?反正我是沒找到

   部署完了再在瀏覽器裏面輸入http://服務器地址:端口號/axis/,就會出現你的Axis的頁面否這說明你沒有配置好Axis…點擊View看一下你的服務是否部署成功了,如果成功的話你可以看到你的服務名旁邊有一個(WSDL),記下它的URL後面用得到,我們在這稱呼這個URLwsdl_URL,主要是爲了好記.

   

*JBuilder 9寫調用Web Service的客戶端

 

        File|New|Web Service,Import a web service,沒錯,wsdl_URL就是我們要importWSDL,倒入成功後你會看到JBuilder會根據這個WSDL產生幾個文件,這些文件封裝了axisSOAP打交道的細節,你不用再關心什麼call之類的對象了,你幾乎可以把web service當作本地的方法來使用

        然後你再建立一個你的客戶端java文件,如下(其中有看不明白的可以參看axis的例子,比我的詳細多了):

 

   public class ws_invoker {

 

       public static void main(String[] args)

       {

          Perdubug_wsServiceLocator pwsl = new Perdubug_wsServiceLocator();

          OrderFormInfo                   ofi    = new OrderFormInfo ();

          ResultInfo                          ri     = null; 

          Perdubug_ws pw; 

 

          OrderOwner  oo = new OrderOwner();

          oo.set_XXX( );  

          ofi .set_XXX( );

 

          try {

 

             pw   = pwsl.getws_entry();

             ri     = pw.syncOrderRelationReq(ofi);

 

           } catch (Exception e) {

 

               System.out.println("exception: " + e.getMessage());

           }

 

         System.out.println("Result: " + ri.get_XXX()); 

       }

  }

 

*運行客戶端,發生了什麼

 

,一運行JBuilder告訴我說什麼OrderOwner沒有反序列化之類的提示序列化,反序列化我猛差了一陣子資料,覺得不對,這些難道axis沒幫我做了嗎?還需要自己來做嗎??這個問題困擾了幾根菸的時間,是不是所謂的簡單對象存取協議就簡單在這呀?我上google股溝了一下我的問題,發現很多人在討論說要改這個配哪個的鬱悶….

我把OrderOwner相關代碼註釋掉,一運行,就可以也就是說JBuilder或者是Axis沒有把我的OrderOwner正確的序列化導致服務器那邊就不認識我的寶貝OrderOwner對象,解決問題的關鍵在哪呢?我查了一下文檔,說在Tomcat 4.1/webapps/axis/WEB-INF/server-config.wsdd,我們先看一下導致我很煩惱的那個server-config.wsdd的片斷:

 

  <service name="Perdubug_ws" provider="java:RPC">

  <parameter name="allowedMethods" value="*"/>

  <parameter name="scope" value="Request"/>

  <parameter name="className" value="mpeonasia_ws.ws_entry"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns1: OrderformInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java: samsungasia_ws.OrderformInfo"

             xmlns:ns1="http:// samsungasia _ws"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns2: ResultInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. ResultInfo"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

猜都猜得出來typeMapping是用來告訴服務器如何Mapping那些JavaBean類的,我一葫蘆畫瓢手動的添加了OrderOwner:

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns3: OrderOwner"

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. OrderOwner"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

然後在運行我的客戶端,就好了不要以爲我會說什麼我從中得到了什麼經驗之類的話,我只想說:爲什麼JBuilder或者是Axis不把這種事情幫我做了而要我自己來動手?最起碼在編譯服務器端的web service的時候提示一下說:GG,這個類沒有被寫進server-config.wsdd或者在JBuilder裏面增加對server-config.wsdd的配置界面吧.

心情鬱悶,爲了這樣的問題,我花了很多時間看如下電子書:

 

O'Reilly - Java and SOAP.pdf

O'Reilly - Java Web Service.pdf

O'Reilly - Programming Web Services with SOAP.pdf

O'Reilly - Programming Web Services With XML RPC.pdf

 

差一點就因爲這個問題把SOAP的什麼Envelop,Body,Head,PortType…文法和WSDL的文法搞了一遍了,我覺得沒什麼意思,浪費我的時間,我現在事情多的打堆.Java我的感覺就是:可選的方案多的打堆,等你搞明白了這個那個又熱起來了,一堆的人又會對你說,快換吧,那個更爽…..爽什麼呀,還不如我在CSDN亂寫些東西爽別人呢..J

 

 


*JBuilder 9寫調用Web Service的客戶端

 

        File|New|Web Service,Import a web service,沒錯,wsdl_URL就是我們要importWSDL,倒入成功後你會看到JBuilder會根據這個WSDL產生幾個文件,這些文件封裝了axisSOAP打交道的細節,你不用再關心什麼call之類的對象了,你幾乎可以把web service當作本地的方法來使用

        然後你再建立一個你的客戶端java文件,如下(其中有看不明白的可以參看axis的例子,比我的詳細多了):

 

   public class ws_invoker {

 

       public static void main(String[] args)

       {

          Perdubug_wsServiceLocator pwsl = new Perdubug_wsServiceLocator();

          OrderFormInfo                   ofi    = new OrderFormInfo ();

          ResultInfo                          ri     = null; 

          Perdubug_ws pw; 

 

          OrderOwner  oo = new OrderOwner();

          oo.set_XXX( );  

          ofi .set_XXX( );

 

          try {

 

             pw   = pwsl.getws_entry();

             ri     = pw.syncOrderRelationReq(ofi);

 

           } catch (Exception e) {

 

               System.out.println("exception: " + e.getMessage());

           }

 

         System.out.println("Result: " + ri.get_XXX()); 

       }

  }

 

*運行客戶端,發生了什麼

 

,一運行JBuilder告訴我說什麼OrderOwner沒有反序列化之類的提示序列化,反序列化我猛差了一陣子資料,覺得不對,這些難道axis沒幫我做了嗎?還需要自己來做嗎??這個問題困擾了幾根菸的時間,是不是所謂的簡單對象存取協議就簡單在這呀?我上google股溝了一下我的問題,發現很多人在討論說要改這個配哪個的鬱悶….

我把OrderOwner相關代碼註釋掉,一運行,就可以也就是說JBuilder或者是Axis沒有把我的OrderOwner正確的序列化導致服務器那邊就不認識我的寶貝OrderOwner對象,解決問題的關鍵在哪呢?我查了一下文檔,說在Tomcat 4.1/webapps/axis/WEB-INF/server-config.wsdd,我們先看一下導致我很煩惱的那個server-config.wsdd的片斷:

 

  <service name="Perdubug_ws" provider="java:RPC">

  <parameter name="allowedMethods" value="*"/>

  <parameter name="scope" value="Request"/>

  <parameter name="className" value="mpeonasia_ws.ws_entry"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns1: OrderformInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java: samsungasia_ws.OrderformInfo"

             xmlns:ns1="http:// samsungasia _ws"/>

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns2: ResultInfo "

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. ResultInfo"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

猜都猜得出來typeMapping是用來告訴服務器如何Mapping那些JavaBean類的,我一葫蘆畫瓢手動的添加了OrderOwner:

  <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"

             encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"

             qname="ns3: OrderOwner"

             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"

             type="java:samsungasia_ws. OrderOwner"

             xmlns:ns2="http:// samsungasia _ws"/>

 </service>

 

然後在運行我的客戶端,就好了不要以爲我會說什麼我從中得到了什麼經驗之類的話,我只想說:爲什麼JBuilder或者是Axis不把這種事情幫我做了而要我自己來動手?最起碼在編譯服務器端的web service的時候提示一下說:GG,這個類沒有被寫進server-config.wsdd或者在JBuilder裏面增加對server-config.wsdd的配置界面吧.

心情鬱悶,爲了這樣的問題,我花了很多時間看如下電子書:

 

O'Reilly - Java and SOAP.pdf

O'Reilly - Java Web Service.pdf

O'Reilly - Programming Web Services with SOAP.pdf

O'Reilly - Programming Web Services With XML RPC.pdf

 

差一點就因爲這個問題把SOAP的什麼Envelop,Body,Head,PortType…文法和WSDL的文法搞了一遍了,我覺得沒什麼意思,浪費我的時間,我現在事情多的打堆.Java我的感覺就是:可選的方案多的打堆,等你搞明白了這個那個又熱起來了,一堆的人又會對你說,快換吧,那個更爽…..爽什麼呀,還不如我在CSDN亂寫些東西爽別人呢..J

 


發佈了58 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章