使用 IBM SOAP 執行時期環境建立 Web 服務

這個執行時期環境是舊版 WebSphere® Studio(5.0 版和更早的版本)唯一支援的 Web 服務執行時期環境。 這個執行時期環境支援 Apache SOAP 2.3。 只有在為了相容於舊版本時,才應該使用它。

限制

在 IBM® SOAP 執行時期環境下使用 Web 服務的限制列出如下。 如果需要完整的限制清單,請參閱限制

  • 與 IBM SOAP 執行時期環境之間的交互作業能力
    • 如果未啟用「啟用元素型對映」(這是預設值)喜好設定(這個喜好設定可以在視窗 > 喜好設定 > Web 服務 > 產生程式碼中找到),且其他供應商的 Web 服務執行時期環境所傳送訊息的元素沒有 "xsi:type" 內容,則 Apache/IBM SOAP 執行時期環境可能無法與這些 Web 服務執行時期環境交互作業。 如果需要詳細資訊,請參閱設定 Web 服務喜好設定
    • 當開始使用會傳回對映或雜湊表陣列的服務 Bean,且已啟用「元素型對映」選項時,產生的 SOAP Proxy 會不正確地將傳回類型對映至 java.lang.String[]。 在執行時期,會發生 ClassCastException。 如果要解決這個問題,請利用新建立的 WSDL 來執行 Web 服務用戶端精靈,再將 SOAP Proxy 重新產生在用戶端專案中。
  • 由下而上的 Web 服務開發
    • 利用 Web 服務精靈從 Java™ 由下而上建立 IBM SOAP 2.2 Web 服務之後,可能會出現針對 "definitions" 元素的身分限制宣告重複的索引鍵值 [...] 這則訊息。 當 IBM SOAP 2.2 的工具產生兩個含有相同 targetNamespace 的 WSDL 檔(其中一個匯入另一個)時,就會出現這則訊息。
    • Java Bean 內容必須同時含有 getter 和 setter,才能作為使用 IBM SOAP 執行時期環境的 Web 服務來正常運作。如果沒有所有的 getter 和 setter,就無法在綱目中產生內容,進而造成執行時期序列化和用戶端產生的問題。請確定所有內容都內含 getter 和 setter。
    • 由於從 charjava.lang.Character 到 WSDL XSD 的預設對映不存在,因此 charjava.lang.Character 需要您輸入自訂對映。
    • 在服務 Bean 的所有輸入參數中,基本封套類型 java.lang.Booleanjava.lang.Bytejava.lang.Shortjava.lang.Integerjava.lang.Longjava.lang.Floatjava.lang.Double 都不能和其對應的各個初始類型 booleanbyteshortintlongfloatdouble 並存。比方說,如果服務 Bean 中的任何位置同時出現了 java.lang.Integerint 作為輸入參數類型, 這個服務 Bean 就無法轉變成完整的 Web 服務。當您試圖利用 Web 服務精靈從這類型的服務 Bean 建立 Web 服務時,除非您沒有在精靈的「Web 服務 Java Bean 方法」頁面中選取包含初始類型或封套類型的方法,否則將會出現一則警告訊息。可是,您必須確定這些方法在第一次使用「Web 服務 Java Bean 方法」頁面時就未被選取。如果您發現該警告可能會產生不完整的 Web 服務,請回到這個頁面,並清除產生問題的方法。在這個情況下,精靈應該重新啟動,使得第一次使用「Web 服務 Java Bean 方法」頁面時就能選取適當的方法。
    • 不支援多維陣列。Java 的替代方案是在維度之間插入 Java Bean。比方說,它不用 MyType[][],其 MyArray 有 MyType[] 類型內容的 MyArray[] 型樣能夠運作。
    • 如果方法的輸入引數清單包含混合的「DOM 元素」與簡式 Bean 類型, 則它需要一或多個自訂對映的項目。「Web 服務定義語言」(WSDL) 1.1 版的規格支援對所有輸入組件(參數)使用單一編碼樣式。簡式物件存取通訊協定 (SOAP) 2.2 版執行時期環境不支援含初始類型之 SOAP 編碼的 DOM 元素及含文字 XML 編碼的 Bean 的預設對映。
    • 當配置自訂對映時,如果您試圖使用 SOAP 執行時期環境的序列化常式或解除序列化常式類別(也就是 org.apache.soap.encoding.soapenc 套件中的類別), 且收到「無法從這個專案載入選取的序列化常式/解除序列化常式類別」的錯誤訊息,這時 soap.jar 很可能不在您的 Web 專案建置路徑中。如果要更正這個問題,請取消精靈,利用「Web 專案內容」對話框來將 WS_installdir\wstools\eclipse\plugins\com.ibm.etools.webservice\run-time environment\soap.jar 新增至 Web 專案的建置路徑中,再重試 Web 服務精靈。
    • 不支援巢狀複式類型的自訂對映。 雖然巢狀類型會出現在精靈的對映頁面中,但這些類型的自訂對映會被忽略。
    • 當從介面含有抽象 Java 類型的 Java 類別建立 Web 服務時,「Web 服務 Java 至 XML 對映」頁面可能會不正確地將抽象類型的解除序列化常式欄位設定為 org.apache.soap.encoding.soapenc.BeanSerializer。 在執行時期環境,這會失敗,因為 BeanSerializer 類別中的解除序列化常式碼無法建立抽象類型的實例。 如果要避免這個情況,必要的話,請選取「自訂對映」選項,將解除序列化常式欄位改成為了將抽象類型解除序列化而撰寫的類別名稱。
    • Web 服務工具目前不支援從含有巢狀內部類別(就是定義在最上層類別內的內部類別)的 Java Bean 建立 Web 服務。如果要解決這個問題,您應該將內部類別移至個別 Java 檔的最上層類別。
    • 當從 Java Bean 建立 Web 服務,且這個 Java Bean 使用含有 Vector、Hashtable 或 Map 類型內容的其他 Java Bean 時,會從名稱空間 "http://xml.apache.org/xml-soap" 中,利用含有 "Vector" 和 "Map" 類型的 complexTypes 來產生 XSD。由於這個名稱空間目前沒有任何綱目,因此,XSD 驗證器會產生如下錯誤和警告:
      • 錯誤 src-resolve:無法將 'xsd2:Vector' 名稱解析成類型定義元件。
      • 警告 src-import.0:無法讀取匯入的綱目文件 'null'。
      這些錯誤和警告不會干擾 Web 服務精靈正確處理 WSDL 和 XSD 的程序。"Map" 和 "Vector" 類型會正確對映至它們的 Java 對等項。請注意,其他供應商在處理含有這些類型的 WSDL 或 XSD 時,可能會有困難,因為 http://xml.apache.org/xml-soap 不是 WSDL 1.1 或 SOAP 1.1 規格所識別的名稱空間。 如果要改進交互作業能力,請考慮將 Java 集合類別改寫成陣列和 Bean,再從配接器建置 Web 服務。
  • 由上而下的 Web 服務開發
    • 這個支援僅限於每一 inputoutput 元素有一 part。它不支援一則輸入或輸出訊息中有多個邏輯 part。系統會處理第一個這類 part,其餘的則會被忽略。
    • 當從使用 xsd (http://www.w3.org/2001/XMLSchema) 名稱空間中的 base64Binary 類型之 WSDL 產生 Web 服務 Skeleton 或 Proxy 時,Web 服務執行時期環境實際上會用 soapenc (http://schemas.xmlsoap.org/soap/encoding/) 名稱空間中的 xsi:type base64。 一般而言,這兩個類型可以自由互換。不過,訊息和綱目的類型差異可能會使某些 SOAP 通訊協定執行時期環境拒絕訊息。 如果發生這個情況,您可以自行撰寫類似 Apache SOAP 的 Base64Serializer 的序列化常式,但這會撰寫 xsd:base64binary,而不是 soapenc:base64。
    • 如果 Java Bean Skeleton 是從包含不是有效的 Java ID 之作業和組件名稱的 WSDL 文件建立的,它們就不會編譯。WSDL 作業和組件名稱必須是有效的 Java ID,才能順利建立 Java Bean Skeleton。
    • 依預設,當產生 WSDL 時,Web 服務精靈會使用 "http" URI,不過,其他工具所產生的某些 WSDL 文件可能會偶而使用所用架構不是 "http"(如 "urn")的 Web 服務、SOAP 動作或目標名稱空間 URI。當從含有非 http URI 的 WSDL 產生 Proxy 或 Skeleton 時,Web 服務精靈可能會將 URI 對映至 Java 套件 "com.example",而不是對映至更有意義的套件。在某些情況下,Web 服務精靈可能會無法完整地處理這類 URI,且會產生「IWAB0234E 發生內部錯誤。」的錯誤
    • 當從 WSDL 產生 Java Proxy 和 Java Skeleton 時,您可以選擇將 XSD 本質類型 boolean、byte、short、int、long、float 和 double 對映至 "java.lang" Wrapper 類型(如 java.lang.Integer),而不是對映至 Java 初始類型(如 int)。 依預設,Web 服務精靈會對映至 Java 初始類型。如果要另行將精靈對映至 "java.lang" Wrapper 類別,請開啟「視窗 > 喜好設定 > Web 服務 > 產生程式碼」 並勾選「將簡式 XML 資料類型對映至 java.lang Wrapper 類別」。
    • 當從 Java Bean 或 EJB 建立 Web 服務而指定從 Java 類型至 XSD 類型的自訂對映時,Bean 類別欄位會自動設為 Java 類型的完整名稱,無法加以編輯。 當自訂對映 Java 陣列時,Bean 類別名稱會採用陣列形式(如 "java.lang.String[]"),且會以相同形式產生在 ".isd" 和 "dds.xml" 部署描述子檔案中。SOAP 執行時期環境無法正確處理這個形式的類別名稱,會產生類似下列錯誤:

      在 SOAP 服務 http://tempuri.org/webservice.AddressBook 中發生部署錯誤:無法解析類別名稱 java.lang.String[]:java.lang.String[]

      因此,您無法在伺服器端自訂對映 Java 陣列的序列化常式。局部的暫行解決方法是將自訂對映的 Serializer 類別欄位保留空白。 這會抑制在部署描述子中產生陣列類別名稱,讓服務能夠運作。請注意,Deserializer 類別和自訂對映解除序列化常式的能力不會受到這個問題和暫行解決方法的影響。

  • 執行時期注意事項
    • 如果您選取「啟用元素型對映」這個 Web 服務產生程式碼喜好設定,且您選擇要部署在 WebSphere Application Server 第 4 版中,ISD 檔和 dds.xml 中可能會出現下列項目:

      <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:x="" qname="x:some-name" xml2JavaClassName="some-serializer"/>

      XML 編輯器可能會設定下列錯誤的旗標:

      屬性 "xmlns:x" 的值無效。附加字首的名稱空間連結不可以是空的。

      這對 WebSphere Application Server 第 4 版沒有影響。 不過,請勿嘗試將這個 dds.xml 部署在使用 Xerces 2.x (XML4J 4.x) 或更新版本(如 WebSphere Application Server 第 5 版)的其他伺服器中。否則,當伺服器載入 dds.xml 檔時,會出現類似的 Xerces 剖析錯誤。 您應該透過 Web 服務實務和選取正確的伺服器類型來重新產生 dds.xml。 這會產生這個伺服器類型的正確 dds.xml。

      另外,當試圖部署這個 ISD 檔的 Web 服務時,也會出現類似的 Xerces 剖析錯誤。 解決方案是將檔案手動編輯成下列格式:

      <isd:map encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" qname="some-name" xml2JavaClassName="some-serializer"/>

    • 當呼叫從 Java Bean 或 EJB 建立的 Web 服務時,如果出現含 targetException 的 SOAPException,例如:"java.lang.IllegalArgumentException: 無法建立實例...",問題可能是顯現成 Web 服務的方法含所包含 Java Bean 沒有作為參數和/或傳回類型的公開預設建構子。必須有公開預設建構子,SOAP 執行時期環境才能將物件建構成解除序列化程序的一部分。
    • 目前部署在 Web 專案的安全檔 cl-ver-config.xml 和 sv-ver-config.xml 是 WebSphere 4.0 版的檔案,不完全符合 DTD。但這兩個檔案能在 WebSphere 4.0 版和 WebSphere 5.0 版中運作,不過,會出現驗證錯誤,指出必須宣告 "xmlns:ds" 或 "xmlns:SOAP-SEC"。
    • 如果您建立一個使用同一個套件中二個不同複式類型的 Bean,當您從這個 Bean 建立 SOAP 型的 Web 服務時,將對每一個複式類型建立一個 XSD 檔案並給予相同的名稱空間。 這會導致同時在作業清單和 Web 服務瀏覽器驗證錯誤。
  • ISD Web 服務
    • 建立 Java 或 EJB Web 服務時,在填入自訂對映之後,「XSD 位置 URL」以外的自訂對映資訊都會儲存在 ISD 檔中。當您從該 ISD 檔建立 Web 服務時,會擷取這項資訊。因此,當您從 ISD 檔建立 Web 服務時,請在精靈的「Web 服務 Java 至 XML 對映」頁面中,以手動方式填入 XSD 位置 URL。
使用條款 | 讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.