gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:10:03 25 4
gpt4 key购买 nike

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

实时网络服务在不同的主机上,所以我在调用服务时需要提供一个 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

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

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

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

更新:

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

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

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

最佳答案

一个解决方案是让您的构建过程安排 wsimport 处理的 WSDL 文件成为您应用程序的类路径资源。有多种方法可以做到这一点,但我们假设您采用 JAR-per-service 方法。因此,您将通过 wsimport 运行 Order.wsdl 并获取生成的类,例如 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");

关于java - 如何在 JAX-WS 调用中指定 url 并避免初始网络连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14881203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com