您可以將使用 Apache SOAP 開發的 Web 服務,移轉到根據 Web Services for Java™ Platform Enterprise Edition (Java EE) 規格開發的 Java API for XML-based RPC (JAX-RPC) Web 服務。
開始之前
如果您原本使用基於 Apache SOAP 的 Web 服務,而現在想要開發和實作 Java 型的 Web 服務,則需要移轉以所有 4.0 版和 5.0.2 之前的 5.0 版所開發的用戶端應用程式。
關於這項作業
基於 Apache SOAP 實作的 SOAP-Security(XML 數位簽章)已移除。請重新配置應用程式並移轉到 JSR-109 Web 服務實作,而不要使用 SOAP-Security。
如果要根據 Java 標準移轉這些用戶端應用程式,請執行下列動作:
程序
- 規劃移轉策略。 將 Apache SOAP 用戶端移植到 JAX-RPC Web 服務用戶端有兩種方式:
因為 JAX-RPC 沒有為使用者撰寫的序列化程式指定架構,所以 JAX-RPC 不支援使用自訂的序列化程式。
如果應用程式無法遵循 WebSphere® Application Server 所支援的 Java、WSDL 和 XML 技術之間的預設對映,請不要試圖移轉應用程式。 本主題的剩餘部分假設您已決定使用 JAX-RPC 動態呼叫介面 (DII) API。
- 檢閱 GetQuote 範例。 資訊中心的「範例」小節提供一個 Web 服務移轉範例。
這個範例位於 GetQuote.java 檔中(最初是針對 Apache SOAP 使用者所撰寫),內含移轉到 JAX-RPC DII 介面所需的變更的相關說明。
如需進一步瞭解,請參閱資訊中心的「範例」小節。
- 將用戶端應用程式從 Apache SOAP 轉換為 JAX-RPC DII Apache SOAP API 和 JAX-RPC DII API 結構很相似。
在兩者中,您可以實例化和配置 Call 物件、設定參數、呼叫作業及處理結果。 在 JAX-RPC 中,您可以使用下列指令建立 Service 物件的通用實例:
javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(new QName(""));
。- 建立 Call 物件。 Apache SOAP 中是使用下列程式碼建立 Call 物件的實例:
org.apache.soap.rpc.Call call = new org.apache.soap.rpc.Call ()
。JAX-RPC 中是使用下列程式碼建立 Call 物件的實例:
java.xml.rpc.Call call = service.createCall();
。
- 設定端點「統一資源識別碼 (URI)」。 在 Apache SOAP 中,作業的目標 URI 當作參數傳遞至
call.invoke: call.invoke("http://...", "");
。在 JAX-RPC 中,setTargetEndpointAddress 方法當作參數傳遞至
call.setTargetEndpointAddress("http://...");
。
Apache SOAP 在 Call 物件上具有 setTargetObjectURI 方法,而此物件包含要求的遞送資訊。
JAX-RPC 沒有同等的方法。在 JAX-RPC 中,targetEndpoint URI 包含 targetObjectURI 中的資訊。
- 設定作業名稱。 Apache SOAP 中是使用下列程式碼在 Call 物件上配置作業名稱:
call.setMethodName("opName");
。JAX-RPC 中使用 setOperationName 方法,此方法接受
QName 而非
String 參數,如下列範例所示:
call.setOperationName(new javax.xml.namespace.Qname("namespace", "opName"));
- 設定編碼樣式。 Apache SOAP 中是使用下列程式碼在 Call 物件上配置編碼樣式:
call.setEncodingStyleURI(org.apache.soap.Constants.NS_URI_SOAP_ENC);
。JAX-RPC 中是以 Call 物件的內容來設定編碼樣式:
call.setProperty(javax.xml.rpc.Call.ENCODINGSTYLE_URI_PROPERTY, "http://schemas.
xmlsoap.org/soap/encoding/");
。
- 宣告參數和設定參數值。 Apache SOAP 參數類型和值由參數實例來說明,並於呼叫之前收集到向量中,而且在 Call 物件上設定,例如:
Vector params = new Vector ();
params.addElement (new org.apache.soap.rpc.Parameter(name, type, value, encodingURI));
// 重複以設定其他參數...
call.setParams (params);
JAX-RPC 中以參數名稱和類型來配置 Call 物件,但不提供它們的值,例如:
call.addParameter(name, xmlType, mode);
// 重複以設定其他參數
call.setReturnType(type);
其中
- name(java.lang.String 類型)是參數的名稱
- xmlType(javax.xml.namespace.QName 類型)是參數的 XML 類型
- mode(javax.xml.rpc.ParameterMode 類型)是參數的模式,例如 IN、OUT 或 INOUT
- 執行呼叫。 Apache SOAP 中是使用下列程式碼在 Call 物件上呼叫作業:
org.apache.soap.Response resp = call.invoke(endpointURI, "");
。在 JAX-RPC 中,參數值是收集到陣列中,並傳遞給
call.invoke,如下列範例所示:
Object resp = call.invoke(new Object[] {parm1, parm2,...});
。
- 檢查錯誤。 在 Apache SOAP 中,您可以經由檢查回應來檢查呼叫時的 SOAP 錯誤:
if resp.generatedFault then {
org.apache.soap.Fault f = resp.getFault;
f.getFaultCode();
f.getFaultString();
}
。在 JAX-RPC 中,如果呼叫時發生 SOAP 錯誤,則會顯示
java.rmi.RemoteException 錯誤。
try {
... call.invoke(...)
} catch (java.rmi.RemoteException) ...
- 擷取結果。 在 Apache SOAP 中,如果呼叫成功並傳回結果,則可以從 Response 物件擷取結果:
Parameter result = resp.getReturnValue(); return result.getValue();
在 JAX-RPC 中,沒有出現異常狀況時,傳回的物件就是呼叫的結果:
Object result = call.invoke(...);
...
return result;
結果
您已將 Apache SOAP Web 服務移轉到基於 Java EE 規格的 JAX-RPC Web 服務。
下一步
根據 Web Services for Java EE 規格開發 Web 服務用戶端。
測試啟用 Web 服務的用戶端,確定移轉處理程序已成功,然後您就可以在 Java EE 環境中實作 Web 服務。