[Java] Axis2 et Web Service, les plus…

Nous avons déjà abordé avec vous la création de web services en Java en utilisant le module Axis2 qui s’installe sur un serveur Apache Tomcat. Dans la première partie, nous vous expliquions en bref comment déployer le module sur le serveur, comment le configurer et comment définir le mot de passe de l’administrateur. Nous vous donnions également l’astuce pour installer le plugin dans NetBeans, dont le support n’est plus assuré officiellement.

Dans la seconde partie, nous avions créé un projet dans l’EDI et nous l’avions testé dans un navigateur Web. Un autre billet, paru un peu plus tard, indiquait la marche à suivre pour l’intégrer facilement dans WinDev. Aujourd’hui, nous allons voir ensemble quelques “astuces” pour aider au développement.

Impossible d’ouvrir la page

Lorsque vous utilisez l’option “Test operation in browser” dans NetBeans, un message d’erreur s’affiche, indiquant ‘”Unable to open web service tester page”. Or, en indiquant vous-même l’URL dans un navigateur, vous obtenez une réponse inattendue du service, à savoir le message “unknown”.

Afin de comprendre cette erreur, nous avons voulu aller plus loin en nous rendant dans les journaux de Tomcat. Ceux-ci sont stockés dans le répertoire “logs” du répertoire d’installation du serveur en question. Le fichier qui nous intéresse est nommé de la manière suivante : tomcat7-stdout.AAAAMMJJ.log. On y trouve l’erreur suivante, liée à la tentative d’exécution depuis le navigateur internet.

java.lang.IllegalArgumentException
at sun.reflect.NativeMethodAccessorImpl.invoke0()
at sun.reflect.NativeMethodAccessorImpl.invoke()
at sun.reflect.DelegatingMethodAccessorImpl.invoke()
at java.lang.reflect.Method.invoke()
at …

Dans notre exemple, nous avions redéployé le service en ajoutant un paramètre à l’une des fonctions. Cependant, la modification du WSDL n’a pas lieu si l’option “Generate WSDL File” a été cochée lors de la création. Dans ce cas, effectuez un clic droit sur le service dans l’arborescence du projet puis dans le menu contextuel, choisissez “Generate WSDL…”. Confirmez par “Oui” pour écraser la version précédente. Notez que le fichier est directement éditable à la main.

Intégrez vos librairies au déploiement

Plutôt que de jouer avec le classloader du serveur, le plugin Axis2 de NetBeans vous permet de directement intégrer les librairies nécessaires pour l’exécution du service. C’est bien plus pratique. Ainsi, dans la vue “Projects”, effectuez les opérations suivantes.

  • Clic droit sur le nom de votre projet, puis “Properties”.
  • Dans l’arborescence de gauche, cliquez sur “Libraries”.
  • Dans l’onglet “Compile” à droite, ajoutez les archives .JAR grâce au bouton “Add JAR / Folder”.
  • Cliquez sur “OK” pour confirmer.
  • Toujours depuis la même vue, effectuez un clic droit sur “Axis2 Web Services” puis choisissez “Configure…”. Cela devrait ouvrir une nouvelle fenêtre.

  • Dans cette nouvelle fenêtre, sélectionnez les librairies que vous voulez intégrer lors du déploiement de votre service. Lors de son exécution, il n’y aura donc plus besoin de rechercher dans les divers répertoires prédéfinis.
  • Cliquez sur le bouton “OK” pour confirmer.
  • Déployez le service : les librairies seront intégrées à l’archive .AAR.

Problème de timeout avec WinDev

En Java, définir le timeout du client n’est pas bien compliqué. Le blog de Singaram propose un exemple concret où il détermine un timeout au niveau du client (stub). L’image ci-dessous provient directement de son blog. Cliquez sur celle-ci afin de l’agrandir…

Pour notre client WinDev, nous avons essayé les autres méthodes qui consistent à éditer les délais directement dans le fichier “axis2.xml”, malheureusement cela n’a eu aucune influence. Pour remédier à ce problème, il suffit d’utiliser la fonction “HTTPRequête” qui reçoit en paramètre une URL Web. Nous appelons donc le Web Service de la même manière que dans un navigateur web, et la réponse obtenue est au format XML.

Dans ce cas, il faudra trouver une méthode pour laisser tomber les balises superflues. La première consiste à insérer vos propres balises dans la réponse et donc, à toujours renvoyer du texte. Il vous suffira alors d’extraire la partie de chaine qui vous intéresse avec un simple appel à “ExtraitChaine”. La seconde consisterait à utiliser les fonctions WLangage disponibles pour parcourir les documents XML. Nous n’avons pas encore testé cette deuxième solution.

Fonctions inaccessibles depuis l’extérieur

Dans la classe de votre Web Service, rien ne vous empêche d’utiliser des fonctions inaccessibles depuis l’extérieur. Soit vous utilisez des fonctions déclarées dans vos classes, qui sont compilées dans une librairie externe, sous forme d’archive .JAR par exemple, soit vous créez des fonctions de type “private” dans la classe associée au service.

Tableau statique de chaines

Dans le code Java du service, nous avons retourné un tableau de type String[] contenant deux chaines en première et deuxième position. Ce tableau peut contenir 20 chaines. La réponse du Web Service est la suivante:

Ainsi, avec de l’imagination et un peu de savoir-faire, tout en utilisant les requêtes HTTP, nous pourrions analyser le retour XML et redéfinir une variable “tableau de chaines” en WLangage. Reste à savoir la manière dont cela est retourné lorsqu’on utilise le service directement importé dans l’environnement WinDev…

Bon développement !

Un commentaire sur « [Java] Axis2 et Web Service, les plus… »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *