J'essaie de consommer un service Web WSDL en Java, dans ce qui sera éventuellement un plugin Eclipse.
Je peux utiliser Fichier> Nouveau> Autre pour sélectionner "Client de service Web", ce qui fonctionne, mais il génère un ensemble de fichiers qui devraient être modifiés/régénérés lorsque le service Web change, ce qui est plutôt déplorable.
Partout où je regarde, je vois différentes façons de faire les choses, mais je ne parviens pas à en faire faire ce que je veux.
Voici un code:
String WsdlUrl = "http://localhost:port/path/to/wsdl";
ArrayList<String> args = new ArrayList();
args.add("arg1");
args.add("arg2");
// etc
Webservice ws = setupWebserviceObject( WsdlUrl );
Object result = ws.invoke("methodname",args);
System.out.println(result);
En gros, ce dont j'ai besoin, c'est de changer "Webservice", "setupWebserviceObject", et "invoke" en quelque chose qui fonctionne, sans avoir besoin de classes pré-générées et avec un minimum de fluff ennuyeux.
Il ne semble pas que cela soit difficile à faire, mais je n’ai pas encore trouvé d’exemple clair sur la façon de le faire.
Quelqu'un peut-il aider?
Je suppose que le concept de "simple" est incompatible avec tout ce qui est WSDL, mais voici quelques exemples:
Création d'un client de service Web dynamique à partir de WSDL à l'aide de JAX-WS .
Création d'un client de service Web à l'aide de l'API Apache Axis2 Axiom .
[Note] J'ai conservé la réponse originale et incomprise ci-dessous, au cas où cela aiderait quelqu'un.
Cet article constitue un bon résumé des options d’implémentation d’un service à partir de WSDL: 5 techniques pour la création de services Web Java à partir de WSDL .
L'implémentation de l'API du fournisseur JAX-WS pourrait être la voie la plus simple si vous utilisez Java 6+.
Manière simple, étape par étape:
Ceci a été réalisé à l'aide d'Apache CXF et de la gestion des dépendances Maven.
1 - Obtenir le descripteur WSDL du service enregistré dans un fichier. Placez-le dans le dossier des ressources de votre projet (le dossier doit figurer dans la liste des dossiers source de votre projet, si vous utilisez Eclipse).
2 - Dans le pom.xml, déclarez les dépendances:
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.7.7</version>
</dependency>
3 - Utilisez le plugin Maven suivant pour générer les classes Java:
<plugin>
<groupId>org.Apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>2.7.7</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>${basedir}/resources/WebService.wsdl.xml</wsdl>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2Java</goal>
</goals>
</execution>
</executions>
</plugin>
4 - Utilisez le code suivant pour effectuer l'appel:
String methodName = "getSomethingFromMyWebService";
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client client = dcf.createClient(ConsumeTest.class.getClassLoader().getResource("WebService.wsdl.xml"));
Object[] res = client.invoke(methodName,parameter1,parameter2, parameterN);
SomethingObject[] somethingObjectList = (SomethingObject[])res[0];
Class.forName(res.getClass().getName()).isArray();
for(SomethingObject so : somethingObjectList){
// do something!
}
5 - Profit!
Notes: Si la méthode ne retourne pas la liste de quelque chose que vous devez transtyper vers l'objet, elle retourne à la place.
Je recommanderais d'utiliser les outils de ligne de commande d'axis2, le plus simplement:
Java2wsdl -cn nom de classe qualifié complet
wsdl2Java -uri wsdlLocation -ss -sd -uw -g -o sortieLocation
cd
dans outputLocation
et exécuter ant
Placez le fichier .aar
généré dans le dossier WEB-INF/services
pour créer un service (inutile si vous ne voulez que le client) et copiez les fichiers de raccord générés dans votre dossier source. Vous pouvez utiliser la classe YourServiceSkeleton
pour implémenter la logique métier et utiliser la classe YourServiceStub
pour le client.