我正在为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文件?
答案 0 :(得分:1)
为WebServiceClient创建一个新的构造函数,并将用户名,密码和端点位置(可能不同)作为参数传递给它。在此之后
requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, pw);
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointUrl);
进入requestContext并确保您不会访问defaultConstructor。