【发布时间】:2012-03-30 13:22:08
【问题描述】:
我正在为 SOAP Web 服务构建客户端。我使用 IntelliJ IDEA 自动生成了大部分客户端代码,告诉它从 WSDL 构建 JaxWS Web 服务客户端。
Web 服务在不同的 URL(测试、集成、生产)上运行,因此我需要能够在客户端中配置服务 URL。我的代码如下所示:
String urlString = props.getProperty(URL);
service = new RequestMultiTransportService(new URL(urlString),
new QName("http://some.uri.com/",
"RequestMultiTransportService"));
Boolean useBasicAuth = Boolean.parseBoolean(props.getProperty(BASICAUTH));
RequestMultiTransport rmt = service.getRequestMultiTransportPort();
if (useBasicAuth) {
String user = props.getProperty(AUTHUSER);
String pw = props.getProperty(AUTHPW);
Map requestContext = ((BindingProvider)rmt).getRequestContext();
requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw);
}
ProvisioningResponse response = rmt.send("some", "params", "...");
如您所见,服务可能需要基本身份验证。这就是问题所在:虽然我可以为实际请求配置基本身份验证,但我无法将其配置为加载 WSDL 文件(这发生在 RequestMultiTransportService 的构造函数中)。 RequestMultiTransportService是IDEA自动生成的,它的构造函数只是调用了它的超级构造函数,是javax.xml.ws.Service之一。
因此,无论 web 服务需要基本身份验证,我的代码都会失败,因为它没有提供用于获取位于 urlString 的 WSDL 文件的用户/密码。我想到的一种可能的解决方法是在本地存储 WSDL 文件并使用file:// URL 指向它。但这并不能满足我的要求,因为 WSDL 文件中定义的服务位置各不相同,而且我似乎无法更改从 WSDL 文件加载的service 对象中的服务 URL。
有没有人通过基本身份验证获取 WSDL 文件的解决方案?
【问题讨论】:
-
好吧,是 JAX-WS 无法做到吗,它看起来像一个错误(我能找到的最相关的是 JAX_WS-1)。由于 JAX-WS 最终将使用
URLConnection,因此可能的解决方法是使用Authenticator。 -
这可能是可行的,但问题是变通方法会设置一个全局属性,这可能会干扰在同一环境中运行的其他服务。
-
只需为 JAX-WS 触发一个错误。也许这是你能做的最好的。
标签: web-services soap intellij-idea jax-ws basic-authentication