3

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

实时 Web 服务位于不同的主机上,因此我需要在进行服务调用时提供一个 url。到目前为止,我的方法是这样的(下面的类是从 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 行中的构造函数实际上对新 URL进行了网络调用!这会导致异常(由于未配置 https),因此我永远不会进入下一行。

背景:我正在实施此问题中概述的双向 ssl 身份验证。这意味着我需要在port服务调用之前配置 ssl 的东西。由于明显的原因,在正确配置 ssl 层之前,我无法让构造函数建立任何连接......

更新:

显然,url 指向 WSDL,而不是使用 jax-ws 标准时的端点。这让我绊倒了。直接从文件加载 WSDL 解决了这个问题。

设置端点 url 是这样完成的:

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

1 回答 1

1

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

URL wsdlLocation = Thread.currentThread().getContextClassLoader().getResource("META-INF/wsdl/Order.wsdl");
于 2013-02-15T04:39:59.837 回答