<message name="registerPetResponse">
<part name="registerPetResponse" element="tns:registerPetResponse"/>
</message>
<portType name="Vet">
<operation name="registerPet">
<input message="tns:registerPetRequest"/>
<output message="tns:registerPetResponse"/>
</operation>
</portType>
<binding name="VetSOAP" type="tns:Vet">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="registerPet">
<soap:operation/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="VetService">
<port name="VetSOAP" binding="tns:VetSOAP">
<soap:address location="http://localhost:9080/VetService/services/Vet"/>
</port>
</service>
</definitions>
registerPet 的 xsd:any 參數可以為以下二者之一:
Cat 或 Fish 的實例 在其他位置或別的時候定義的其他寵物類型的實例。xsd:any 背離了 WSDL 的用途
請注意,上面列出的兩個參數并未在 WSDL 中定義。我自己確定其定義。WSDL 即 Web 服務描述語言 (Web Services Description Language)。其主要的用途就是盡可能完整地描述服務的接口。當使用 xsd:any 時,您就背離了 WSDL 的此用途。
第一個項目符號聲明該參數將為 cat 或 fish。但 WSDL 并不告訴您這一點。它所標明的是該參數可以為任何事物?紤]到這是一個獸醫服務,則可能不會處理訂單或保險索賠或稅收報表——但您可能恰恰會這樣猜想;WSDL 并沒有告訴您這些信息。
處理此偽多態性的一個更好方法是定義真正的多態性。定義一個基類型,稱為 Pet,然后重新編寫 Cat 和 Fish 來對 Pet 進行擴展。
第二個項目符號聲明其他類型將在其他地方或別的時候進行定義。這表明這個 WSDL 并不是此服務的完整接口。這可能會讓人覺得可以更改服務并保持 API 不變,但由于此 WSDL 不是完整的 API,這樣的說法就不成立了。對于使用此 WSDL 的客戶機,要成功地與此服務進行通信,僅這個 WSDL 是不夠的?蛻羰欠窨梢詫⒍涛趋{ (alligator) 送來接受服務?只通過查看 WSDL,您不會知道答案(我認識的可以給短吻鱷看病的獸醫也不多!)。您需要一些更多的帶外定義。
JAX-RPC 與 xsd:any 之間的關系不是特別友好
文章來源于領測軟件測試網 http://www.kjueaiud.com/