2010-04-20 10 views
5

Sto sperimentando con Apache CXF e ho una domanda sulla parte client.Come fornire l'indirizzo del server al client del servizio Web basato su Apache CXF configurato in Spring?

Qui di seguito è la mia configurazione di Spring corrente del client WS di qualche com.example.customerservice.service.CustomerService:

<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> 

Come si vede, l'attributo address è configurato staticamente. Questo non è adatto per me perché non conosco l'URL del server in anticipo. Inoltre, in determinati scenari mi piacerebbe utilizzare questo client per servizi diversi che hanno indirizzi diversi.

configurazione Pertanto statico l'indirizzo del server in primavera non è appropriato. Quindi la mia domanda è: come posso renderlo dinamico?

  • Al momento la mia soluzione è quella di impostare una proprietà di sistema - qualcosa come baseUrl e iniettarlo nel config primavera con il configuratore di proprietà segnaposto.
  • Un'altra possibilità sarebbe semplicemente quella di costruire manualmente il client che non mi piace davvero.

ma credo che sono davvero manca qualcosa. Forse c'è la possibilità di qualcosa come clientFactory.createClientFor("http://myserver:8080")?

risposta

4

vedi post a CXF Users Mailing List.

Hai un paio di opzioni:

1) Se si vuole lasciare la vostra contesto primavera come è e modificare l'indirizzo a livello di codice in fase di esecuzione:

È possibile impostare una proprietà standard nel contesto richiesta. Ecco un esempio di su come eseguire questa operazione a livello di programmazione.

BindingProvider bp = porta (BindingProvider); contesto di contesto = bp.getRequestContext(); Oggetto oldAddress = context.get (BindingProvider.ENDPOINT_ADDRESS_PROPERTY); context.put (BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newAddress);

Nel fare questo, si dovrebbe essere consapevoli di accesso multi-threaded a un client proxy. Vedere la CXF FAQ (Are JAX-WS proxy client thread-safe?)

2) Se siete disposti/in grado di fornire gli URL WSDL e utilizzare le API JAX-WS, si possibile scrivere codice portabile che creerà un cliente proxy collegato a un endpoint di propria scelta. È possibile utilizzare l'attributo "createdFromAPI" (Configurazione di un client Spring (opzione 1)) nel file di contesto di Spring per consentire ancora la configurazione basata su Spring del proxy del client creato a livello di programmazione . Penso che qui siano supportati anche i caratteri jolly, quindi dovresti essere in grado di configurare un numero di client utilizzando una singola voce nel tuo contesto nel contesto Spring. Questo approccio diventerà più complesso se gli spazi dei nomi/nomi locali degli endpoint variano notevolmente tra gli endpoint con cui si sta tentando di interagire con .

3) Utilizzare org.apache.cxf.jaxws.JaxWsProxyFactoryBean a livello di programmazione come mostrato nella configurazione Spring di Configuring a Spring Client (Opzione 2) [2]. Ciò consente di impostare l'interfaccia e l'indirizzo e creare nuove istanze del client proxy a piacere. Potresti anche voler configurare una singola istanza di questo factory con la maggior parte delle proprietà già impostate in Primavera e quindi iniettarle nel codice in cui puoi cambiare l'indirizzo e creare un nuovo proxy client a volontà (fornendo accesso sincronizzato al fagiolo di fabbrica, naturalmente). È inoltre possibile memorizzare nella cache i proxy client per evitare di dover ricreare ripetutamente .

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

+0

Ciao David, sì, grazie, l'ho visto. Ci sto provando oggi e riferisco. – lexicore

+2

Ho finalmente optato per la creazione programmatica tramite jaxWsProxyFactoryBean: finale JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); jaxWsProxyFactoryBean.setServiceClass (CustomerService.class); jaxWsProxyFactoryBean.setAddress (webAppEnvironment.getBaseUrl() \t \t \t + "/ CustomerServicePort"); Questo è, tre righe di codice. Abbastanza per i miei scopi al momento. – lexicore

Problemi correlati