2013-01-14 32 views
2

我必須聯繫Web服務(WS)。我使用JDK 1.6,maven 3.04,Spring 3.20和apache的CXF 2.7.2。使用maven,我爲WS創建了stubs,併爲它提供了wsdl文件。我對WS客戶彈簧的配置,它看起來像REQ:Spring配置CXF ws客戶端 - 替換硬編碼變量,如'地址'

的servlet-context.xml的

<jaxws:client id="paymentClient" serviceClass="com.xxx.payment.Payment" 
    address="http://127.0.0:8088/mockPaymentBinding" <!-- SOAPUI mock --> 
    username="username" 
    password="secret" /> 
<!- username and password are for wsdl basic authentication --> 

在Java代碼中,它看起來像

@Autowired 
com.xxx.payment.Payment client; 
.. 
// Set all needed parameters. 
PaymentGetBalanceResponse response = null; 
PaymentGetBalance getBalance = new PaymentGetBalance(); 
RequestGetBalance value = new RequestGetBalance(); 
value.setTransactionId("transActionId"); 
getBalance.setRequest(value); 

// Now call the WS and get the response 
response = client.getBalance(getBalance); // generated by the cxf -client argument. 

「響應」線是由CXF生成的一個例子。然後Eclipse告訴我缺少一些東西(getbalance),並且可選地爲我在線之上創建它。然後,其他東西(價值)缺失等等。最後,所有參數都被正確填寫。所有缺失的東西/變量/對象都在生成的存根代碼中。

這工作就像一個魅力,但地址是atm在春季配置硬編碼。應用程序的配置參數存儲在一個簡單的數據庫中。使用spring bean可以訪問內容,因此我可以使用類似config.getValue(URL)的代碼在代碼中獲取變量。

我希望能夠在上面的代碼中更改'地址'(url WS),但還沒有找到辦法做到這一點。在生成的存根代碼中找不到setter。另一種方法是在spring servlet-context.xml文件中使用變量,但這些變量必須來自數據庫。第二種選擇。我可能會/希望從底部開始並使用Objectfactorys(在存根中)創建對象。然後設置正確的參數(在'新'或setter中),然後工作到頂部。一個同事做了這個(不是'地址'),這似乎工作,但代碼是最不理想/'凌亂'。此外,我希望能夠配置用戶名和密碼,而不是靜態的。在CXF網站上做了很多RTM,但無濟於事。

閱讀關於JaxWsProxyFactoryBean的一些信息,但無法知道如何在此處應用它,因爲我使用了Springs @autowire功能。

我一直在關於這個問題打斷了我的大腦,但看起來我的神經元在圈內運行。任何幫助/指針真的很感激。

回答

1

來自CXF用戶指南:How to override the service address?

如果我正確地推斷出在Spring配置,我想這會做:

@Autowired 
    com.xxx.payment.Payment client; 
    // ... 
    BindingProvider provider = (BindingProvider)client.getServicePort(); 
    // You can set the address per request here 
    provider.getRequestContext().put(
     BindingProvider.ENDPOINT_ADDRESS_PROPERTY, 
     "http://my/new/url/to/the/service");