JAX-RPC 与 JAX-WS 的比较,第 3 部分:服务端点接口
2009-11-03 00:00:00 来源:WEB开发网在 JAX-RPC 中,没有用于 WSDL 操作的异步映射,所以这里没有办法进行比较。然而,重要的是,异步映射仅适用于客户端。对于服务端点,不存在类似的异步映射,只能用于客户端。
比较 IN/OUT 参数
JAX-RPC 和 JAX-WS 都支持称为 IN/OUT 参数的参数。在清单 14 中,您可以看到在清单 1 的 WSDL 中添加了一个 IN/OUT 参数。请注意,不管对于输入还是输出,都出现了名为“inout”的参数。在这个场景中,JAX-RPC 和 JAX-WS 将该参数映射为一个 Holder 参数,但是对于不同的映射,其效果是不同的。
清单 14. 带 IN/OUT 参数的 WSDL<xsd:element name="hello">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" nillable="true" type="xsd:string" />
<xsd:element name="inout" nillable="true" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="helloResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="response" nillable="true" type="xsd:string" />
<xsd:element name="inout" nillable="true" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
清单 15 提供了 Holder 参数的 JAX-RPC 映射,而清单 16 提供了 JAX-WS 映射。
清单 15. 带 IN/OUT 参数的 JAX-RPC SEIpublic interface HelloWorld extends java.rmi.Remote {
public java.lang.String hello(
java.lang.String name,
javax.xml.rpc.holders.StringHolder inout) throws java.rmi.RemoteException;
}
清单 16. 带 IN/OUT 参数的 JAX-WS SEI@WebService(name = "HelloWorld", targetNamespace = "urn:helloWorld/sample/ibm/com")
public interface HelloWorld {
@WebMethod(action = "urn:helloWorld/sample/ibm/com/hello")
@RequestWrapper(localName = "hello",
targetNamespace = "urn:helloWorld/sample/ibm/com",
className = "helloworld.sample.ibm.com.Hello")
@ResponseWrapper(localName = "helloResponse",
targetNamespace = "urn:helloWorld/sample/ibm/com",
className = "helloworld.sample.ibm.com.HelloResponse")
public void hello(
@WebParam(name = "name", targetNamespace = "")
String name,
@WebParam(name = "inout", targetNamespace = "", mode = Mode.INOUT)
Holder<String> inout,
@WebParam(name = "response", targetNamespace = "", mode = Mode.OUT)
Holder<String> response);
}
对于 JAX-RPC,规范中为各种已知的类型定义了一组类作为 Holder 类。这些类型包括 java.lang.String 和其他基本数据类型。对于用户定义的类型,JAX-RPC 需要生成能够处理用户定义类型的自定义的 Holder 类。另一方面,对于 JAX-WS,可以使用 Java 5 的泛型编程特性,提供适用于所有类型(包括用户定义类型)的单个类。
另一个有趣的内容是返回类型的区别。JAX-WS 并不像 JAX-RPC 那样保存返回类型,而是让方法的返回类型为 void,并使用 Holder 来获取返回值。根据 JAX-WS 中的规则,如果对于一个操作存在多个可以作为 OUT 参数的参数,那么返回类型必须为 void,并且将所有的 OUT 参数映射为 Holder 类型。
总结
上面的示例说明,尽管 JAX-RPC 和 JAX-WS 之间存在很多的区别,但是从 WSDL 到服务端点接口结构的映射是非常类似的。关键的区别包括:
包名不同。
JAX-RPC 需要 java.rmi.Remote 和 java.rmi.RemoteException,而 JAX-WS 不需要。
对 Holder 进行了不同的定义。
即使存在这些类似的地方,但是有一个主要的区别,使得 JAX-WS SEI 不同于 JAX-RPC。JSR-181 注释的使用,使得 JAX-WS SEI 可以以 Java 为中心或者以 WSDL 为中心来表示 Web 服务。可以包括大量的注释,以便将 Java 信息映射回 WSDL 构件。JAX-RPC SEI 无法通过任何形式来提供这类信息。还有一些特性是 JAX-WS 所特有的,即异步调用模型,以及它不需要提前生成 SEI。另一方面,JAX-RPC 也具备一些 JAX-WS 所没有的特性:它支持 RPC/encoded WSDL。
更多精彩
赞助商链接