JAX-WS 与 SAAJ 样式,使用哪种

2022-09-04 23:06:37

使用 Service 和 Dispatch 类从 Java 代码调用 Web 服务与 SOAPConnection 类之间有什么区别(哲学上的或其他区别)?

例如,像这样:

SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = scf.createConnection();
SOAPMessage reply = soapConnection.call(soapMessage, url);

与大致沿着这些路线的东西?

svc = Service.create(url, serviceName);
Dispatch<SOAPMessage> dispatch = svc.createDispatch(portName, SOAPMessage.class, service.Mode.MESSAGE);
SOAPMessage reply = (SOAPMessage)dispatch.invoke(soapMessage);

它们之间有什么区别,为什么选择一种方法而不是另一种方法?


答案 1

以下行摘自 Java SOA Cookbook - O'Reilly

“SOAP 连接允许您将 SOAP 消息发送到 URL 末尾的资源。这在任何情况下都很方便使用,但如果该服务没有定义的 WSDL,则这是必需的。这是因为调用 Service.create 需要传入 WSDL 的位置。您可能很少没有带有基于 SOAP 的服务的 WSDL,但它确实发生了,并且您将做好准备。

若要创建与不公开 WSDL 的 Web 服务的连接,可以使用 SOAPConnection 类直接与远程资源进行通信。然后,创建一个 URL 对象,表示要调用的远程资源 (servlet)。将 SOAP 请求消息和要调用的终结点传递给连接对象上的调用方法,然后等待它返回 SOAP 响应。

• 传递给 connection.call 方法的终结点 URL 可以是字符串,也可以是 java.net.URL。


答案 2

我有一种感觉,在最后,调度只是将操作委托给SAAJ层。但是,我无法确认这一点。

从什么是更好的实践的角度来看,那么我觉得调度方法更合适,因为它抽象出了使用较低级别的SAAJConnection API的一些开销。例如 - 无需在连接实例上执行 close(),与 SOAPConnection 实例不同,无需重新创建调度引用。


推荐