web-dev-qa-db-fra.com

Exemple simple de consommation du service Web WSDL avec Java?

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?

7
Peter Boughton

Je suppose que le concept de "simple" est incompatible avec tout ce qui est WSDL, mais voici quelques exemples:

[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+.

7
maerics

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.

1
Ric Jafe

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.

0
mdikici