2010-04-20 7 views
5

J'expérimente Apache CXF et j'ai une question sur la partie client.Comment fournir l'adresse de serveur au client de service Web Apache CXF configuré par Spring?

Ci-dessous mon actuelle configuration de printemps du client WS de certains 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> 

Comme vous le voyez, l'attribut address est configuré de manière statique. Cela ne me convient pas car je ne connais pas l'URL du serveur à l'avance. De plus, dans certains scénarios, j'aimerais utiliser ce client pour différents services ayant des adresses différentes.

Par conséquent, la configuration statique de l'adresse du serveur dans Spring n'est pas appropriée. Donc ma question est - comment puis-je le rendre dynamique?

  • Au moment ma solution est de définir une propriété de système - quelque chose comme baseUrl et l'injecter dans la config de printemps en utilisant l'espace réservé de la propriété configurateur.
  • Une autre possibilité serait de construire simplement le client manuellement que je n'aime pas non plus.

Mais je crois qu'il me manque vraiment quelque chose. Peut-être qu'il y a une possibilité de quelque chose comme clientFactory.createClientFor("http://myserver:8080")?

Répondre

4

Voir article à CXF Users Mailing List.

Vous avez un couple d'options:

1) Si vous voulez quitter votre contexte de printemps comme il est et changer l'adresse programmation lors de l'exécution:

Vous pouvez définir une propriété standard dans le contexte de la demande. Voici un exemple de la façon de le faire par programme.

BindingProvider bp = (port BindingProvider); Map context = bp.getRequestContext(); Object oldAddress = context.get (BindingProvider.ENDPOINT_ADDRESS_PROPERTY); context.put (BindingProvider.ENDPOINT_ADDRESS_PROPERTY, newAddress); Dans ce cas, vous devez être conscient de l'accès multi-thread à un proxy client. Voir la FAQ de CXF (Les threads des clients JAX-WS sont-ils sûrs?)

2) Si vous souhaitez/pouvez fournir des URL WSDL et utiliser les API JAX-WS, vous pouvez écrire du code portable qui créera un client proxy connecté à un point d'extrémité de votre choix. Vous pouvez utiliser l'attribut "createdFromAPI" (Configuration d'un Spring Client (Option 1)) dans votre fichier de contexte Spring pour toujours autoriser la configuration basée sur le printemps du proxy client construit par programme. Je pense que les caractères génériques sont également pris en charge ici, donc vous devriez pouvoir configurer un certain nombre de clients en utilisant une seule entrée dans votre contexte Spring. Cette approche deviendra plus complexe si le point de terminaison namespaces/local names varie grandement entre les points de terminaison que vous essayez d'interagir avec .

3) Utilisez org.apache.cxf.jaxws.JaxWsProxyFactoryBean par programme comme indiqué dans la configuration Spring de la configuration d'un client Spring (Option 2) [2]. Ceci vous permet de définir l'interface et l'adresse et de créer de nouvelles instances de proxy client à volonté. Vous pouvez même configurer une seule instance de cette usine avec la plupart des propriétés déjà définies dans Spring, puis l'injecter dans votre code où vous pouvez changer l'adresse et construire un nouveau proxy client à volonté (fournissant un accès synchronisé à la haricot d'usine bien sûr). Vous pouvez également mettre en cache les proxies client pour éviter les frais de recréer à plusieurs reprises.

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

+0

Salut David, oui, merci, je l'ai vu. Je l'essaie aujourd'hui et je fais rapport. – lexicore

+2

J'ai finalement opté pour la création par programmation via jaxWsProxyFactoryBean: final JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean(); jaxWsProxyFactoryBean.setServiceClass (CustomerService.class); jaxWsProxyFactoryBean.setAddress (webAppEnvironment.getBaseUrl() \t \t \t + "/ CustomerServicePort"); Voici trois lignes de code. Assez pour mes fins en ce moment. – lexicore

Questions connexes