Atelier SOA – Web Services - Leçon n°2 : Développement ...

chuckleelephantbutteSoftware and s/w Development

Jun 9, 2012 (4 years and 10 months ago)

608 views


Atelier SOA – Web Services
BARON Mickaël – Février 2011
Leçon n°2 : Développement de Web Services avec JAX-WS et NetBeans
Temps estimé : ~2,5 heures
Le but de cette deuxième leçon est d’apprendre à manipuler l’API JAX-WS pour le développement de Web Services
étendus à partir de la plateforme de développement Java. La leçon insiste sur le développement d’un Web Service
suivant les approches Bottom / Up et Top / Down puis sur le développement de la partie cliente d’un Web Service et
enfin sur la manipulation de Handler.
Buts pédagogiques : Transformation d’un POJO Java en Web Service, génération des artifacts à partir d’une
description WSDL, utilisation de l’outillage fourni par JavaSE 6, mise en place d’un intercepteur (handler), clients Web
Service en mode synchrone et asynchrone, outils wsgen et wsimport.
Exercice 1 : Développer un Web Service suivant une approche montante « Bottom / Up »
But : Décrire un Web Service à partir d’une interface Java, implémenter le Web Service, déployer sous Glassfish, tester le Web Service
via SOAP-UI.
Description : Le Web Service de ce premier exercice consiste à fournir des opérations pour la gestion d’un carnet
d’adresses simplifié. Une opération pour ajouter une personne, une autre pour récupérer la liste
complète et enfin une dernière opération pour récupérer une personne par un nom. Une personne
est décrite par un nom (String) et une adresse (String).
Etapes à Suivre
1. Démarrer l’environnement de développement NetBeans 6.7.1
2. Créer un nouveau projet File -> New Project… puis Java Web et choisir Web Application, faire Next.
3. Dans le nom du projet choisir le nom NotebookWebServiceExercice1.
4. Comme type de serveur d’application, choisir GlassFish 2.1 (fonctionne parfaitement avec GlassFish 3.0) et
comme version Java EE choisir Java EE 5 (fonctionne parfaitement avec Java EE 6 profile Web) puis faire Next.
5. Ne rien choisir dans les Frameworks, puis faire Finish. L’initialisation du projet est en cours.
6. Créer une classe qui représentera une personne (File -> New File… puis choisir Java et enfin Java Class), puis faire
Next. Appeler la classe Person et la définir dans le package soa.jaxwslabs.notebookwebserviceexercice1, puis
faire Finish.
7. Dans la nouvelle classe créée, ajouter un attribut name de type String et un attribut address de type String.
Définir un constructeur par défaut (important pour JAXB) et un constructeur avec deux paramètres
correspondant respectivement aux deux attributs. Générer les modifieurs et accesseurs. Pour la génération
exploiter les outils fournis par NetBeans (Insert Code… via le menu contextuel de la classe Java).
8. Définir une interface Java représentant la description du Web Service (File -> New File… puis choisir Java et
enfin Java Interface) puis faire Next. Définir comme nom de l’interface NotebookService et utiliser le précédent
package. Faire Finish.
9. Ajouter les méthodes suivantes dans l’interface NotebookService
• void addPerson(Person p)
• List<Person> getPersons()
• Person getPersonAt(String name)
10. Ajouter une annotation @WebService au niveau de l’interface puis initialiser l’attribut name à NotebookService et
l’attribut targetNamespace à http://soa.jaxwslabs.notebookwebserviceexercice1.
11. Construire une nouvelle classe appelée NotebookServiceImpl qui implémente l’interface NotebookService
12. Ajouter une annotation @WebService au niveau de la classe puis modifier les attributs de l’annotation comme
décrit ci-dessous :
• endpointInterface = soa.jaxwslabs.notbookwebserviceexercice1.NotebookService
• serviceName = NotebookService
BARON Mickael
-1-

baron@ensma.fr / baron.mickael@gmail.com • portName = NoteBookPort
13. Ci-dessous est donné un exemple d’implémentation. Saisir le code de la classe NotebookServiceImpl.

14. Faire un Clean and Build à partir du projet NotebookWebServiceExercice1 et s’assurer que le projet se construit
correctement.
15. Faire un Deploy à partir du projet. Le serveur Glassfish doit démarrer. Sur la console de Glassfish, un Web
Service doit avoir été découvert, un message similaire doit être présent :

16. Afficher sa description WSDL et examiner le résultat par rapport à ce qui a été défini dans l’interface Java.
17. Pour tester le comportement du Web Service vous pouvez soit utiliser l’outil SOAP-UI (voir atelier 1) soit
utiliser l’outil fourni par JAX-WS (à partir du projet sous NetBeans, afficher le menu contextuel du sous-nœud
de Web Services qui est NotebookServiceImpl).
BARON Mickael
-2-

baron@ensma.fr / baron.mickael@gmail.com Exercice 2 : Développer un Web Service suivant une approche descendante « Up / Down »
But : Générer les artifacts d’un Web Service à partir d’une description WSDL, implémenter le Web Service, déployer sous Glassfish,
tester le Web Service, wsimport
Description : Dans cet exercice nous développons un Web Service à partir de sa description WSDL. Pour cela,
nous nous basons sur la description WSDL du Web Service obtenue à la fin de l’exercice 1.
L’intérêt est de montrer que la génération des classes (artifacts) ne donne pas exactement les mêmes
classes que celles construites et utilisées dans l’exercice 1.
Etapes à Suivre
1. Créer un nouveau projet de type Web Application nommé NotebookWebServiceExercice2.
2. Ajouter un nouveau fichier File -> New File… puis choisir Web Services et enfin Web Service from WSDL. Faire
Next.
3. Dans le champ Web Service Name saisir la valeur NotebookServiceImpl, dans le champ package
soa.jaxwslabs.notebookwebserviceexercice2, dans le champ Select Local WSDL File or Enter WSDL URL
saisir l’URL du WSDL de l’exercice 1. L’outil analyse le WSDL et propose de choisir le port, sélectionner celui
par défaut. Faire Finish.
4. Un ensemble de classes est généré par l’outil wsimport. Ces classes ne doivent pas être modifiées puisqu’elles sont
générées automatiquement. Seule la classe NotebookServiceImpl peut l’être. Elle correspond à la classe
implémentant le comportement du Web Service. Réutiliser le code de l’exercice 1 pour compléter cette classe.
5. Faire un Clean and Build (s’assurer qu’il n’y a aucune erreur) et faire un Deploy.
6. Comparer le WSDL obtenu par l’exercice 1 avec celui obtenu par l’exercice 2. Sont-ils identiques ?
Exercice 3 : Développer un client de Web Service en mode synchrone
But : Développer un client d’un Web Service, appel synchrone, outil wsimport, client Web via une JSP
Description : Cet exercice consiste à appeler le Web Service défini dans l’exercice 1. Un client léger via une JSP
est utilisé pour appeler l’opération getPersons() définie par le Web Service. Cette opération est
invoquée en mode synchrone, c’est-à-dire que le client est en attente de la réponse pour continuer
son traitement.
Etapes à Suivre
1. Créer un nouveau projet de type Web Application nommé NotebookWebServiceClientExercice3.
2. Ajouter un nouveau fichier File -> New File… puis choisir Web Services et enfin Web Service Client. Faire Next.
3. Dans le champ WSDL URL, saisir l’URL http://localhost:1708/NotebookWebServiceExercice1/NotebookService?wsdl et
vérifier que les options sont paramétrées comme montrées sur la figure ci-dessous.

4. Un ensemble de classe est généré par l’outil wsimport. Elles représentent les classes liées au mapping JAXB (voir
répertoire NotebookWebServiceClientExercice3\build\generated-sources\
BARON Mickael
-3-

baron@ensma.fr / baron.mickael@gmail.com 5. Éditer la page index.jsp de manière à invoquer l’opération getPersons() en mode synchrone. Saisir le code comme
décrit ci-dessous :

6. L’opération getPersons() est invoquée via l’utilisation de la classe NotebookService. Le retour de l’opération est traité
dans une boucle qui affiche pour chaque personne les informations concernant le nom et l’adresse. Déployer et
tester l’application.

Exercice 4 : Développer un client de Web Service en mode asynchrone
But : Développer un client d’un Web Service, appel asynchrone, outil wsimport, client lourd via une interface graphique SWING.
Description : Cet exercice consiste à appeler le Web Service défini dans l’exercice 1. Un client lourd défini via une
interface graphique SWING est utilisé pour invoquer l’opération addPerson(…) en mode
asynchrone. L’intérêt de cet exercice est de montrer comment paramétrer la génération des artifacts
via wsimport pour le mode asynchrone.
Etapes à Suivre
1. Créer un nouveau projet File -> New Project… puis Java choisir Java Application, faire Next.
2. Choisir comme nom de projet NotebookWebServiceClientExercice4 et comme nom de la classe principale
(Main) soa.jaxwslabs.notebookwebserviceclientexercice4.WebServiceClient puis faire Finish.
3. Ajouter un nouveau fichier File -> New File… puis choisir Web Services et enfin Web Service Client. Faire Next.
4. Dans le champ WSDL URL, saisir l’URL http://localhost:1708/NotebookWebServiceExercice1/NotebookService?wsdl et
configurer de la même manière que dans l’exercice 3 (étape 3).
5. Au niveau de la gestion des Web Services du projet (nœud Web Service References), accéder aux propriétés du
service NotebookService (menu Edit Web Service Attributes). Ouvrir l’onglet WSDL Customization, déplier l’option
Global Customization et cocher l’option Enable Asynchronous Client (voir figure ci-dessous pour plus de précision).
BARON Mickael
-4-

baron@ensma.fr / baron.mickael@gmail.com
6. Il vous sera demandé de régénérer les artifacts liés au client Web Service. Choisir le Web Service
NotebookService et faire Refresh Client.
7. Dans la classe WebServiceClient recopier le code présenté ci-dessous.

8. Dans la partie Libraries, ajouter la dépendance vers la bibliothèque JAX-WS 2.1 (menu Add Library… et choisir
JAX-WS 2.1).
9. Faire un Clean and Build à partir du projet puis exécuter le programme. Le résultat attendu est celui montré sur la
figure ci-dessous.
BARON Mickael
-5-

baron@ensma.fr / baron.mickael@gmail.com
Exercice 5 : Développer un Web Service en utilisant l’outillage de JavaSE 6
But : Développer un Web Service avec JavaSE 6, EndPoint, méthode publish, serveur Web intégré.
Description : L’objectif de cet exercice est de développer et publier un Web Service en utilisant les fonctionnalités
offertes par JavaSE 6. L’exemple utilisé par l’exercice 1 (Notebook) est utilisé.
Etapes à Suivre
1. Créer un nouveau projet File -> New Project… puis Java choisir Java Application, faire Next.
2. Choisir comme nom de projet NotebookWebServiceJavaSE6Exercice5 et comme nom de la classe principale
(Main) soa.jaxwslabs.notebookwebservicejavase6exercice5.JavaSE6WebService puis faire Finish.
3. Recopier l’interface NotebookService et les classes NotebookServiceImpl et Person issues de l’exercice 1
dans le projet NotebookWebServiceJavaSE6Exercice5 (respecter le nouveau nom de package).
4. Dans la classe JavaSE6WebService recopier le code présenté ci-dessous

BARON Mickael
-6-

baron@ensma.fr / baron.mickael@gmail.com 5. Dans la partie Libraries, ajouter la dépendance vers la bibliothèque JAX-WS 2.1 (menu Add Library… et choisir
JAX-WS 2.1) utilisée pour le moteur de Web Service.
6. Faire un Clean and Build à partir du projet puis exécuter le programme.
7. Ouvrir une page de votre navigateur préféré et vérifier que le WSDL s’affiche correctement (URL :
http://localhost:8080/notebook).
Exercice 6 : Ajouter un intercepteur (handler) à un Web Service
But : Implémentation handler, configuration du Web Service, filtrage par opération.
Description : Dans cet exercice un intercepteur est ajouté au Web Service décrivant le carnet d’adresses.
L’intercepteur a pour fonction de filtrer les messages SOAP de telle sorte que le traitement de
l’opération getPersons() ne soit pas réalisé.
Etapes à Suivre
1. Créer un nouveau projet de type Web Application nommé NotebookWebServiceExercice6.
2. Créer un package intitulé soa.jaxwslabs.notebookwebserviceexercice6.
3. Recopier l’interface NotebookService et les classes NotebookServiceImpl et Person issues de l’exercice 1
dans le projet NotebookWebServiceExercice6 (respecter le nouveau nom de package).
4. Dans la classe NotebookServiceImpl, ajouter l’annotation @HandlerChain(file =
"handler.xml") au niveau de la description de la classe.
5. Ajouter un fichier handler.xml, au niveau du répertoire WEB-INF de l’application Web.

6. Ajouter une nouvelle classe intitulée SOAPLoggingHandler dont le code est défini de la manière suivante :
BARON Mickael
-7-

baron@ensma.fr / baron.mickael@gmail.com
7. Noter que la méthode getMethodName(…) s’occupe d’extraire du contenu du message SOAP le nom de
l’opération.
8. Faire un Clean and Build à partir du projet de déployer l’application.
9. À partir de l’outil SOAP-UI (voir atelier 1), vérifier que l’appel à l’opération getPersons retourne une réponse vide.
BARON Mickael
-8-

baron@ensma.fr / baron.mickael@gmail.com