2010-12-10 90 views
3

Je veux développer un service web SOAP avec TDD. Le service Web est construit sur Apache CXF et protégé avec une authentification de base. Mon idée est de mettre en place les tests unitaires à l'aide d'un client dynamique pour éviter le processus de création du proxy.Comment créer un client webservice dynamique avec une authentification de base avec Apache CXF?

La documentation montre comment créer un client dynamique 1:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 
Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl"); 
Object order = Thread.currentThread().getContextClassLoader() 
    .loadClass("demo.order.Order").newInstance(); 
Method m1 = order.getClass().getMethod("setCustomerID", String.class); 
m1.invoke(order, "C001"); 
Object[] response = client.invoke("processOrder", order); 

Ok, qui semble prometteur. Mais comment puis-je spécifier un nom d'utilisateur et un mot de passe pour l'authentification de base? Le WSDL et le service lui-même sont protégés par une authentification de base.

Bye,
Olaf

Répondre

2

J'ai pris un coup d'oeil au code source d'Apache CXF. Je pense que la version actuelle de CXF (2.3.1) n'est pas capable de récupérer un WSDL à partir d'une URL qui est protégée avec une authentification de base. Habituellement, vous créez un client dynamique de cette façon:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); 
Client client = dcf.createClient(
    "http://localhost:8080/ws-auth/EchoService?wsdl"); 

Malheureusement, vous obtiendrez un ServiceConstructionException en retour:

org.apache.cxf.service.factory.ServiceConstructionException: 
Could not resolve URL "http://localhost:8080/ws-auth/EchoService?wsdl". 
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.composeUrl(DynamicClientFactory.java:6) 
... 

Je ne pouvais pas trouver un endroit pour définir les informations d'identification pour l'authentification de base. Comme une solution de contournement je pourrais télécharger le WSDL avec l'aide d'un deuxième outil (peut-être httpclient) et le stocker dans un dossier temporaire. CXF pourrait consommer ce fichier et irait un avec la création du client. J'ai essayé de cette façon mais je n'ai pas eu de chance. Une autre exception est apparue. Ce qui n'était pas une surprise parce que je n'étais pas capable de trouver comment remettre les informations d'identification au client créé dynamiquement. La documentation d'Apache CXF pourrait être plus étendue. Franchement, je ne sais plus si Apache CXF est la meilleure option pour cette tâche. Quelqu'un connaît-il un outil ou un framework qui supporte les tests des services web SOAP de manière simple? Comme je l'ai mentionné précédemment, il devrait créer le proxy de service dynamiquement en analysant le WSDL. Peut-être qu'il existe des solutions de travail en dehors du monde Java. Comment les gars de Ruby ou de Python traitent-ils ce problème? Peut-être que je peux adopter leurs approches en utilisant JRuby ou Jython dans mes tests unitaires.