最后,为了使用此服务,您必须将此 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
文章来源于领测软件测试网 https://www.ltesting.net/