2010-04-20 32 views
5

我正在試驗Apache CXF並對客戶端部分有疑問。如何向Spring配置的基於Apache CXF的Web服務客戶端提供服務器地址?

下面是一些com.example.customerservice.service.CustomerService的WS客戶端的我目前的Spring配置:

<jaxws:client 
    name="com.example.customerservice.service.CustomerServiceClient" 
    serviceName="customer:CustomerServiceService" endpointName="customer:CustomerServiceEndpoint" 
    address="http://localhost:8080/CustomerServicePort" 
    serviceClass="com.example.customerservice.service.CustomerService"> 
    <jaxws:features> 
     <bean class="org.apache.cxf.feature.LoggingFeature" /> 
    </jaxws:features> 
</jaxws:client> 

正如你看到的,address屬性靜態配置。這不適合我,因爲我不提前知道服務器URL。此外,在某些情況下,我希望將此客戶端用於具有不同地址的不同服務。

因此,Spring中服務器地址的靜態配置並不合適。所以我的問題是 - 我怎樣才能使它動態?

  • 目前我的解決方案是設置系統屬性 - 類似於baseUrl,並使用屬性佔位符配置器將其注入到Spring配置中。
  • 另一種可能性是簡單地手動構建我不太喜歡的客戶端。

但我相信我真的錯過了一些東西。也許有類似clientFactory.createClientFor("http://myserver:8080")的可能性?

回答

4

查看帖子對CXF Users Mailing List。如果你想離開你的Spring上下文是在運行時更改地址 編程

1):

您可以在請求上下文中的標準屬性

你有幾個選項。下面是一個示例 如何以編程方式執行此操作。

BindingProvider bp =(BindingProvider)port; Map context = bp.getRequestContext(); Object oldAddress = context.get(BindingProvider.ENDPOINT_ADDRESS_PROPERTY); context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newAddress);

當你這樣做時,你應該知道對客戶端 代理的多線程訪問。 2)如果您願意/能夠提供WSDL URL並使用JAX-WS API,您可以編寫可移植代碼來創建一個客戶端(請參閱CXF常見問題解答(JAX-WS客戶端代理是否線程安全?)

代理連接到您選擇的端點 。您可以在Spring上下文文件中使用「createdFromAPI」(配置Spring 客戶端(選項1))屬性,以仍然允許 以編程方式構建的客戶端代理的基於Spring的配置。 我認爲這裏也支持通配符,所以你應該能夠在你的 Spring上下文中配置許多使用單個條目的客戶端。如果端點 名稱空間/本地名稱在嘗試與 進行交互的端點之間差別很大,則此方法將變得更加複雜。

3)使用org.apache.cxf.jaxws。JaxWsProxyFactoryBean編程方式如配置Spring客戶端(選項2)的Spring配置中的 [2]。 這可讓您設置接口和地址並隨意創建新客戶端代理 實例。您甚至可能希望在Spring中配置大多數屬性的 工廠的單個實例,然後將其注入到 您的代碼中,您可以隨意更改地址並隨意構建新的客戶端代理 (提供同步訪問工廠豆當然)。 您也可以緩存客戶端代理,以避免重複創建 這些代理。

http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%253F http://cxf.apache.org/docs/jax-ws-configuration.html

+0

大衛你好, 是的,謝謝你,我已經看到了。我今天試了一下並報告回來。 – lexicore 2010-04-21 17:59:15

+2

我終於選擇通過jaxWsProxyFactoryBean進行編程創建: final JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); jaxWsProxyFactoryBean.setServiceClass(CustomerService.class); jaxWsProxyFactoryBean.setAddress(webAppEnvironment.getBaseUrl() \t \t \t +「/ CustomerServicePort」); 這就是三行代碼。目前我的目的夠了。 – lexicore 2010-04-21 20:07:57

相關問題