Déploiement et Appel aux web services Java avec Axis

Mohamed KARAMI

Ce tutoriel est destiné aux débutants J2EE, il explique comment utiliser le framework Axis sous Apache Tomcat pour créer, déployer et consommer un web service en Java.

- Titre : Déploiement et Appel aux web services Java avec Axis

- Auteur : Mohamed KARAMI

- Parution : 7 octobre 2006

- Mise à jour : 17 février 2020

- Licence : Copyright ® 2013 karami. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Outils et ressources

- II. Remerciements

- III. Lancement et configuration d'Axis

- III-A. Configuration de Tomcat

- III-B. Démarrage de Tomcat

- III-C. Démarrage d'Axis

- IV. Méthode de déploiement 1

- IV-A. Création du web service

- IV-B. Déploiement du web service

- IV-C. Test du web service

- V. Méthode de déploiement 2

- V-A. Compilation de la classe du web service

- V-B. Définition du descripteur de déploiement

- V-C. Déploiement du web service

- V-D. Exécution du web service par son alias

- VI. Consommer le web service en Java

- VI-A. Création du fichier de description du web service « wsdl »

- VI-B. Utilisation du générateur « WSDL2Java »

- VI-C. Définition du client Java

- VII. Désactivation du web service

I - Outils et ressources

Outils utilisés

- Axis 1.4 ;

- Apache Tomcat 5.5.17 ;

- Eclipse 2.1.

Ressources

- La source du web service.

- La source du client Java.

- Bibliothèques d'activation d'Axis : ici.

II - Remerciements

Merci à Neo41 pour sa lecture et ses corrections, à RideKick pour sa relecture. Merci à Ricky81 pour ses conseils, et un grand merci également à Nono40, réalisateur de l'éditeur XML.

III - Lancement et configuration d'Axis

Le serveur de déploiement « Axis » est installé comme une application Web au sein du moteur de servlets et de JSP « Apache Tomcat ».

Note : pour réaliser notre web service dans les meilleures conditions, c'est préférable de faire une installation standard de Tomcat et la machine virtuelle JDK, en effet pendant l'installation ne changez pas les chemins d'installation standard, car sinon on peut se retrouver dans des situations où on aura des erreurs étranges et difficiles à interpréter.

III-A - Configuration de Tomcat

Avant de lancer Tomact vous devez vérifier que Tomcat pointe sur le JDK et non pas le JRE, car ceci peut causer une erreur assez fréquente concernant le fichier tools.jar (tools.jar est présent dans le dossier « lib » du JDK, mais il n'existe pas dans le JRE), et voici l'erreur que vous pouvez avoir : « java.lang.RuntimeException: No compiler found in your classpath! (you may need to add 'tools.jar') ». Donc votre Java Virtual Machine doit être comme ceci : « JAVA_HOME\jre\bin\server\jvm.dll ».

III-B - Démarrage de Tomcat

Vous devez, pour accéder aux possibilités de « Axis », activer préalablement le serveur « Apache Tomcat » (j'utilise la version 5.5.17 de Tomcat). Pour cela, sous Tomcat 4, vous double-cliquez sur : « dossierInstallation\Tomcat 4\bin\startup.bat ». Sous Tomcat 5.5.x, vous double-cliquez sur : « dossierInstallation\Tomcat 5.5\bin\tomcat5.exe ». Ou tout simplement, si le service Tomcat est installé, utilisez « Monitor Tomcat » puis le menu « Start Service ».

III-C - Démarrage d'Axis

Pour installer Axis (j'utilise la version 1.4), décompresser le fichier « axis-bin-1_4.zip », puis copier le dossier « axis-1_4\webapps\axis » dans « dossierInstallation\Tomcat 5.5\webapps\ », comme ça Axis sera une application web déployée sous Tomcat. Il vous manquera la bibliothèque « activation.jar » et d'autres optionnelles : « soap.jar » et « mail.jar »… que vous pouvez copier dans « dossierInstallation\Tomcat 5.5\common\lib\ ». Pour vérifier la bonne installation et éventuellement accéder aux services web existants sur « Axis », vous redémarrez Tomcat et vous tapez dans un navigateur : http://localhost:8080/axis. Ensuite, vous pouvez cliquer sur « Validate » puis « List »:

La validation teste l'existence des bibliothèques requises par Axis :

IV - Méthode de déploiement 1

IV-A - Création du web service

La première étape consiste à définir la classe du service web qui retournera au client la somme de deux entiers.

La définition de cette classe est la suivante :

Le web service

public class sommer {
public int getsomme(int a, int b) {
return a+b;
}
}

Utilisez un éditeur de texte simple, Kate sous Unix ou Bloc-notes sous Windows.

Attention, vous devez sauvegarder votre classe sous le fichier portant le même nom de la classe et suffixé par « jws » ! Ici, le fichier de sauvegarde sera donc : « sommer.jws ».

IV-B - Déploiement du web service

La deuxième étape consiste à déployer le service au sein d'un fournisseur de services web. L'environnement d'exécution et de déploiement des services web que nous utilisons est, comme vous l'avez déjà constaté, l'outil « Axis ». Le premier mode de déploiement sous « Axis » que nous allons mettre en œuvre est le plus simple qui soit ; c'est le déploiement instantané par fichier « JWS ». Vous noterez qu'il n'est pas nécessaire de compiler le fichier source Java.

Pour réaliser le déploiement, il suffit de copier le fichier « sommer.jws » dans le domaine applicatif de « Axis ». Le domaine d'application de « Axis » est : « dossierTomcat/webapps/axis », vous devez donc copier le fichier « sommer.jws » dans ce dossier.

Vous êtes désormais en mesure d'accéder à votre service à l'URL suivante : http://localhost:8080/axis/sommer.jws.

Vous devez alors constater que votre service a bien été déployé sur « Axis » en ayant en retour la page « HTML » suivante :

Si vous cliquez sur ce dernier lien, vous verrez la définition « WSDL » (générée automatiquement par « Axis ») de votre service web.

IV-C - Test du web service

La dernière étape consiste à mettre en œuvre votre service qui est désormais accessible à travers tout le Net ! Pour exécuter une méthode de votre service et obtenir la réponse « SOAP » correspondante, vous tapez l'expression suivante dans votre navigateur :

http://localhost:8080/axis/sommer.jws?method=getsomme&amp;a=2&amp;b=3

Par rapport à l'expression précédente, vous précisez ici le nom de la méthode à exécuter, sous la forme de la valeur de l'attribut « method » et vous précisez les valeurs des paramètres a et b. La réponse affichée est le contenu « SOAP », c'est-à-dire un fichier « XML » dont voici un extrait :

V - Méthode de déploiement 2

Dans l'exercice précédent, nous avons mis en œuvre un mode de déploiement entièrement pris en charge par « Axis ». Ce mode automatique de déploiement présente les contraintes suivantes : nécessité de disposer des sources des classes dont on veut définir le ou les services. En effet, le mode de déploiement automatique d'Axis travaille sur la source des classes Java ; impossibilité de décrire des particularités de déploiement (classes publiques et privées). Ce sont pour ces raisons que nous devons parfois réaliser un déploiement explicite. Cela implique la définition d'un fichier particulier, appelé descripteur de déploiement du service web. Ce fichier porte l'extension « wsdd » pour « Web Service Deployment Descriptor ».

V-A - Compilation de la classe du web service

La première étape consiste à compiler la classe que vous avez définie, renommer le fichier « sommer.jws » en « sommer.java » et compilez-le par commande « javac sommer.java », après vous devez copier la classe résultante dans le dossier « jwsClasses » ou « Classes » dépendamment de votre version du serveur Tomcat.

V-B - Définition du descripteur de déploiement

Le descripteur de déploiement doit être placé dans le même dossier que le « .wsdl » définissant le service. Appelons ce descripteur « deploy.wsdd ». Son contenu sera minimalement celui-ci :

Déploiement du web service

<deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
<service name="sommer" style="java:RPC">
<parameter name="className" value="sommer"/>
<parameter name="allowedMethods" value="*"/>
</service>
</deployment>

Expliquons les différents éléments :

Balise de début avec comme attributs les espaces de noms des balises mises en oeuvre dans un descripteur de déploiement.
deployment xmlns="http://xml.apache.org/axis/wsdd/"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
Le nom d'invocation du service, avec le mode, ici "RPC". Ce sera le principal mode que nous mettrons en oeuvre.
service name="sommer" style="RPC"
Ensuite, la classe compilée associée au service
parameter name="className" value="sommer"
Ensuite, les autorisations d'accès au service (ici toutes les méthodes)
parameter name="allowedMethods" value="*"
Fin de la balise "service"
service
Fin de la balise "deployment"
deployment

V-C - Déploiement du web service

Le descripteur de déploiement doit être maintenant pris en compte par le serveur « Axis » (i.e. le fournisseur de services) pour réaliser le déploiement du service. Pour ce faire, il convient d'utiliser l'utilitaire « AdminClient » du serveur « Axis ».

La ligne de commande est alors : « java org.apache.axis.client.AdminClient deploy.wsdd ».

Si les bibliothèques Axis ne sont pas spécifiées dans le classpath, vous devez le faire comme suit dans un fichier « deploy.bat » de préférence :

Le classpath

set OLD_CLASSPATH=%CLASSPATH%
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\activation.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\mail.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\axis.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\jaxrpc.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\wsdl4j.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\commons-discovery.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\commons-logging.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\saaj.jar
set CLASSPATH=%CLASSPATH%;%AXIS_HOME%\lib\log4j-1.2.4.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\xerces.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\servlet-api.jar
set CLASSPATH=%CLASSPATH%;?TALINA_HOME%\common\lib\naming-factory.jar
set CLASSPATH="%CLASSPATH%"
java - CLASSPATH="%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd
set CLASSPATH=%OLD_CLASSPATH%

Parmi les bibliothèques Axis incluses dans le classpath, il faut faire attention aux versions de quelques-unes, donc il vaut mieux vérifier manuellement la correspondance des noms des fichiers existants dans le dossier « Axis\lib » et leurs noms dans le classpath définit ci-dessus. Si vous rencontrez encore des problèmes avec le classpath essayez de remplacer la commande « (java - CLASSPATH= »%CLASSPATH%« org.apache.axis.client.AdminClient deploy.wsdd) par (java - CLASSPATH= ».;%CLASSPATH%" org.apache.axis.client.AdminClient deploy.wsdd).

Si vous n'arrivez pas à lancer correctement la commande à l'aide du classpath, vous pouvez décompresser ces bibliothèques dans le dossier « AXIS_HOME\WEB-INF », ça ne sera pas assez propre comme solution, mais c'est efficace, et vous aurez seulement à lancer la commande : « java org.apache.axis.client.AdminClient deploy.wsdd ».

L'arborescence du dossier Axis (avec l'utilisation du classpath) devra être comme illustré dans la figure suivante :

Nous avons, lors de l'étape précédente, demandé au serveur « Axis » d'être en mesure de traiter toutes les requêtes « SOAP » correspondant à notre service « sommer ». Cela signifie donc qu'à la réception d'une requête « HTTP-SOAP », le serveur pourra appliquer la méthode spécifiée dans la requête à une instance de la classe correspondant à notre service (en lui passant, le cas échéant des valeurs). Vous êtes désormais en mesure d'accéder à votre service à l'URL suivante : http://localhost:8080/axis/services/sommer.

Le nom « sommer » correspond au nom du service que nous avons indiqué dans le descripteur de déploiement. Vous pouvez alors constater que votre service a bien été déployé sur « Axis » en ayant en retour la page « HTML » suivante :

V-D - Exécution du web service par son alias

La dernière étape consiste à mettre en œuvre votre service qui est désormais accessible à travers tout le Net ! Pour exécuter une méthode de votre service et obtenir la réponse « SOAP » correspondante, vous tapez l'expression suivante dans votre navigateur : http://localhost:8080/axis/services/sommer?method=getsomme&a=2&b=3.

Par rapport à la méthode précédente, vous précisez ici le nom du web service par son alias (ici « sommer »). La réponse affichée est le contenu « SOAP », c'est-à-dire un fichier « XML » comme :

VI - Consommer le web service en Java

Jusqu'à ce stade, nous avons toujours utilisé le navigateur Web pour invoquer les services et visualiser (sous le format SOAP) les résultats retournés. Nous allons étudier maintenant, un autre mode de communication avec les services plus adapté à leur mise en œuvre, et surtout à l'intégration avec d'autres applications. Ce deuxième modèle consiste à la mise en œuvre des Services Web depuis le langage Java en générant automatiquement la définition du Proxy côté client. Cela sous-entend la création de toutes les interfaces et classes nécessaires à la mise en œuvre du service depuis Java. Ce modèle est caractérisé par :

- utilisation du stub côté client et du skeleton côté serveur ;

- utilisation des interfaces représentant les types des objets Java à manipuler.

VI-A - Création du fichier de description du web service « wsdl »

Pour ce faire, nous utiliserons le même service précédent, dans le navigateur utilisez le menu « Fichier puis Enregistrer sous ». Puis nommez le fichier « sommer.wsdl » dans le dossier « Tomcat 5.5\webapps\axis\WEB-INF ».

Note : « wsdl » signifie selon http://dico.developpez.com : langage de description des web services, respectant la syntaxe XML. Il donne une définition abstraite des services, le détail des types de données échangées, les opérations possibles, le protocole à utiliser ainsi que l'adresse (URL) du service.

VI-B - Utilisation du générateur « WSDL2Java »

L'outil « Axis » qui permet la génération des définitions Java côté client et côté serveur, s'appelle « org.apache.axis.wsdl.WSDL2Java ». L'invocation depuis une fenêtre DOS, est la commande: « java org.apache.axis.wsdl.WSDL2Java sommer.wsdl ».

Remarque

Le fichier « sommer.wsdl » peut-être créé simplement, comme on l'a déjà fait, en sauvegardant le contenu de la fenêtre navigateur, lorsque l'on visualise la définition « wsdl » du service : http://localhost:8080/axis/services/sommer?wsdl. L'outil « WSDL2Java » génère l'ensemble des définitions dans un sous-dossier correspondant au nom « targetNamespace= »http://127.0.0.1:8080/axis/services/sommer » du descripteur  wsdl. En effet, les namespaces sont mappés en packages Java.

VI-C - Définition du client Java

Avant de définir le client Java, je commence par clarifier quelques ambiguïtés qui peuvent vous passer par la tête.

- À quoi il sert le Stub généré ?
Ce fichier est le seul point d'entrée pour le web service, il contient toute l'information dont on a besoin pour invoquer le web service : noms des méthodes, types des paramètres et les types de retour, et c'est qui permet à l'auteur du web service de protéger son code.

- Aurais-je besoin des bibliothèques d'Axis pour consommer le web service ?
NON, c'est seulement le serveur déployant le web service qui doit contenir les bibliothèques Axis.

- Quels sont les fichiers dont j'ai besoin pour consommer le web service ?
Nous aurons seulement besoin des fichiers générés (Stub) par la commande wsdl2java, il faut juste importer ces fichiers dans l'application et utiliser les interfaces présentes dans ce Stub.

On définit maintenant le client Java qui met en œuvre les classes générées lors de l'étape précédente. Pour cela, votre client ressemblera à ceci :

Client Java

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import _1._0._0._127.axis.sommer_jws.*;
public class SommerClient {
public static void main(String[] args) {
// Création du service depuis le endpoint
// SommerService correspond au nom du service dans le fichier "wsdl"
// c'est la balise : wsdl:service name="sommerService"
SommerService service = new SommerServiceLocator();
try {
// Utilisation du service pour obtenir un stub qui implemente le SDI
// (Service Definition Type ; i.e. PortType).
// Pour le typage, c'est la balise : wsdl:portType name="sommer"
// Pour le getsommer(), le sommer correspond à la balise :
// wsdl:port binding="impl:sommerSoapBinding" name="sommer"
Sommer port = service.getsommer();
int s;
try {
// Mise en œuvre du service par application directe des méthodes
s = port.getsomme(2, 3);
System.out.println("2+3 = " + s);
} catch (RemoteException e1) {
e1.printStackTrace();
}
} catch (ServiceException e) {
e.printStackTrace();
}
}
}

Sous Eclipse vous aurez comme ceci (j'ai utilisé « http://127.0.0.1 » au lieu de « http://localhost », c'est pourquoi j'ai le chemin généré « _1._0._0.127 » :

Pour connaître les noms des classes et interfaces à utiliser, vous devez examiner le contenu du dossier contenant les classes et interfaces générées ainsi que le fichier « wsdl » ayant permis cette génération.

VII - Désactivation du web service

Enfin pour retirer un service déployé, il suffit d'appliquer l'utilitaire « AdminClient », créer un fichier « undeploy.wsdd » correspondant au service. Le contenu du fichier « undeploy.wsdd » sera toujours le même, au nom de service près. Pour le service « sommer », nous aurons :

Suppression du web service

<undeployment xmlns="http://xml.apache.org/axis/wsdd/">
<service name="sommer"/>
</undeployment>

Ensuite, la ligne de commande est simplement : « java org.apache.axis.client.AdminClient undeploy.wsdd ».

Bibliographies:

- https://www.developpez.net

- https://dico.developpez.com

- http://ws.apache.org/axis