如何在JAX-WS调用中指定url并避免初始网络连接?

时间:2013-02-14 18:03:26

标签: java jax-ws

我使用wsimport http://localhost/Order.wsdl的JAX-WS标准来生成客户端存根类。

实时网络服务位于不同的主机上,因此我需要在拨打服务电话时提供网址。到目前为止我的方法是这样的(下面的类是从wsimport生成的):

 1. OrderService s = new OrderService (
                                       new URL("https://live/WS/Order"), 
                                       new QName(...));
 2. OrderServicePort port = s.getOrderServicePort();

 3. configureHttpCertificatesStuff(port) // Set up ssl stuff with the port

 4. port.placeOrder(args); // The actual ws call

首先:这是指定网址的正确方法吗?

第二:第1行中的构造函数实际上对新网址进行网络调用!这导致异常(由于未配置https),所以我永远不会到达下一行。

背景:我正在实现this question中概述的双向ssl身份验证。这意味着我需要在服务调用之前在port中配置ssl内容。在我出于显而易见的原因正确配置ssl层之前,我无法让构造函数建立任何连接...

更新

当使用jax-ws标准时,表示URL是WSDL,而不是端点。这让我失望了。直接从文件加载WSDL解决了这个问题。

设置端点网址的方式如下:

BindingProvider b = (BindingProvider) port;        
b.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl);

1 个答案:

答案 0 :(得分:1)

一种解决方案是让您的构建过程安排由wsimport处理的WSDL文件成为您的应用程序的类路径资源。有很多方法可以做到这一点,但我们假设您采用JAR-per-service方法。因此,您需要Order.wsdlwsimport并运行生成的类,例如OrderServiceOrderServicePort,并将它们填入order-service.jar。您可以做的另一件事是将Order.wsdl的副本填入META-INF/wsdl/Order.wsdl的同一个JAR中。假设JAR文件是应用程序类路径的一部分,您可以通过执行以下操作获取WSDL的URL:

URL wsdlLocation = Thread.currentThread().getContextClassLoader().getResource("META-INF/wsdl/Order.wsdl");