JaxWS:具有基本身份验证的Web服务

时间:2012-02-15 15:55:15

标签: web-services soap intellij-idea jax-ws basic-authentication

我正在为SOAP Web服务构建一个客户端。我使用IntelliJ IDEA自动生成大部分客户端代码,告诉它从WSDL构建JaxWS Web服务客户端。

webservice在不同的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文件?

1 个答案:

答案 0 :(得分:1)

为WebServiceClient创建一个新的构造函数,并将用户名,密码和端点位置(可能不同)作为参数传递给它。在此之后

requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw);
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl);

进入requestContext并确保您不会访问defaultConstructor。