我正在爲SOAP web服務構建客戶端。我使用IntelliJ IDEA自動生成了大部分客戶端代碼,通過告訴它從WSDL構建JaxWS webservice客戶端。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文件的解決方案?
那麼,是JAX-WS無法做到它看起來像一個錯誤(最相關我能找到的是[JAX_WS-1](http://java.net/jira/browse/JAX_WS-1?focusedCommentId= 15246#action_15246))。由於JAX-WS將在一天結束時使用'URLConnection',可能的解決方法是使用['Authenticator'](http://stackoverflow.com/a/496707/267197)。 – 2012-02-19 11:15:13
這可能是可能的,但問題是解決方法將設置全局屬性,這可能會干擾在相同環境中運行的其他服務。 – flyx 2012-02-24 14:22:01
只需爲JAX-WS發起一個錯誤。也許這是你能做的最好的事情。 – 2012-02-24 17:24:38