我使用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);
答案 0 :(得分:1)
一种解决方案是让您的构建过程安排由wsimport
处理的WSDL文件成为您的应用程序的类路径资源。有很多方法可以做到这一点,但我们假设您采用JAR-per-service方法。因此,您需要Order.wsdl
到wsimport
并运行生成的类,例如OrderService
和OrderServicePort
,并将它们填入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");