最后,為了使用此服務,您必須將此 WSDL 映射到某個語言綁定。我將討論一下 JAX-RPC 規范方面的情況。根據 JAX-RPC,xsd:any 映射到 javax.xml.soap.SOAPElement,而后者是在 SAAJ 規范中定義的類型。SAAJ 是與 DOM 類似的 API,用于訪問 SOAP 消息中的 XML 實例。SAAJ 是一種用于訪問 XML 實例數據的非常動態的低級別方法,不是特別友好。請參見清單 2,以查看清單 1 中的 WSDL 的 Java 接口。
清單 2. 使用 xsd:any 的 WSDL 的 Java 接口
package any;
public interface Vet extends java.rmi.Remote {
public void registerPet(javax.xml.soap.SOAPElement any)
throws java.rmi.RemoteException;
}
對于動態程序員而言,這可能是個非常好的映射,但我們其他人卻寧愿使用生成的 Cat 和 Fish 類,也不愿使用 SOAPElement。如果可以直接將一個 Cat 或 Fish 放入 SOAPElement 中,這樣也挺好,但沒有特定于 SAAJ 的方式來進行此操作。JAX-RPC 規定 xsd:any 映射到 SOAPElement,但仍然未能提供用于在類實例和 SOAPElement 之間進行轉換的方法。
如果您習慣使用 DOM、SAX 或 SAAJ,則 xsd:any 對您而言就不是問題。不過您需要考慮一下您的 WDSL 的使用者的情況。僅由于您習慣這種級別的編程,您的 WSDL 的其他使用者是否也對此很熟悉呢?
關于 xsd:anyType 的一些思考
xsd:any 的一個替代方法是 xsd:anyType(請參閱清單 3 中的 WSDL——與清單 1 的不同之處在于使用粗體突出顯示——和清單 4 中的 Java 接口)。xsd:anyType 的缺點在于 JAX-RPC 未為其定義映射。因此,即使有供應商映射此 XML 類型,您仍然無法編寫使用該類型的可移植代碼。雖然這樣說,此類型仍然有一個優勢,即一些供應商(如 IBM)將其映射到了 java.lang.Object 之類的有用類型。對于 WebSphere Application Server 的 SOAP 引擎,如果方法接受 java.lang.Object 類型的參數,則可以將任何 Java 對象發送到該方法,而且,只要該對象是符合 XML 標準的對象,就可以將其序列化到 SOAP 消息中。另一方面,如果接收端 SOAP 引擎知道如何將 XML 實例反序列化為 Java 對象,它就將進行此操作。如果引擎不知道如何反序列化該對象,接收方將獲得一個 SOAPElement,和使用 xsd:any 時一樣。
請記住,盡管 xsd:anyType 看起來比 xsd:any 更好用,但缺乏 JAX-RPC 映射支持。只有在以下情況它才具有優勢:
您不擔心代碼是不可移植的。
服務實現和該服務對應的客戶機實現的基礎平臺具有針對 xsd:anyType 的某種映射。
清單 3. 使用 xsd:anyType 的獸醫服務 WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions
targetNamespace="urn:any"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="urn:any"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema
文章來源于領測軟件測試網 http://www.kjueaiud.com/