0

我正在爲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文件的解決方案?

+1

那麼,是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

+0

這可能是可能的,但問題是解決方法將設置全局屬性,這可能會干擾在相同環境中運行的其他服務。 – flyx 2012-02-24 14:22:01

+0

只需爲JAX-WS發起一個錯誤。也許這是你能做的最好的事情。 – 2012-02-24 17:24:38

回答

0

爲您的WebServiceClient創建一個新的構造函數,並將用戶名,密碼和端點位置(可變)作爲參數傳遞給它。在此之後,將

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

放入requestContext並確保您不會訪問defaultConstructor。

+3

如何訪問構造函數中的requestContext?我不需要調用'super.getPort()'(我認爲在初始化完成後不工作)?如果我不調用超級構造函數,那是不是意味着客戶端根本不加載WSDL文件? – flyx 2012-03-30 07:33:20