Développement de Services Web avec JAX-
WS
Cheyma ben njima
Plan
Généralités
Développement serveur
Développement client
Les annotations JAX-WS
Généralités JAX-WS
JAX-WS est l’acronyme Java API de XML Web
Services
JAX-WS est à la fois un standard et une implémentation
La version courante est JAX-WS 2.2
Précédemment JAX-WS s’appelait JAX-RPC
JAX-WS fait partie de la plate forme Java EE de Sun
Microsystems
JAX-WS : JSR
JAX-WS s’appuie sur le JSR 224 (Java
Specification Request) :
JSR : définition
•Le JCP (Java Community Process) est le processus chargé
de définir les évolutions de Java
• Chaque évolution est traitée sous la forme de propositions
nommées JSR (Java Specification Request)
• Chaque JSR possède un numéro (identifiant unique)
JAX-WS : JSR 224
JAX-WS propose un ensemble d’API pour l’implémentation
de services Web avec Java
Facilite l’envoie et la réception de message SOAP en
masquant la complexité du langage au développeur
Le fournisseur et le consommateur de service n’ont pas
besoin de traiter les messages SOAP
Le traitement de bas niveau est réalisé par JAX-WS
JAX-WS : JSRs
La spécification JAX-WS dépend d’autres spécifications
définies dans d’autres JSRs :
JSR 109 : Web Services. Cette JSR définit le modèle de
programmation et d’exécution de services web (EJB) sur JEE
JSR 181 : Web Services Metadata. Propose des annotations qui
facilitent la définition et le déploiement de services web.
JSR 222 : JAXB. Propose un ensemble d’API pour permettre le
parsing de Java en XML (et vice versa).
JSR 250 : Common Annotations. Propose des annotations utilisable
par des composants définie JEE ou en java (JSE)
JAX-WS: modèles de programmation
• Modèle de programmation côté serveur
• Permet le développement de services web sous forme de
servlets ou des EJB (Entreprise Java Bean)
• Modèle de programmation côté client
• Permet l’accès à un service web distant
JAX-WS Annotations
• Les annotations jouent un rôle important dans
JAX-WS
1. Les annotations sont utilisées pour le mapping de Java
en WSDL
2. Les annotations sont utilisées lors de l’exécution pour
contrôler et répondre aux invocations du service
• Les annotations utilisées par JAX-WS sont définies
dans des JSRs séparées :
JSR 224 : JAX-WS
JSR 181 : Web Services Metadata
JSR 222 : JAXB
JSR 250 : Common Annotations
JAX-WS : Développement serveur
Développement Serveur : Top/Down et Bottom/Up
Deux façons pour développer un Service Web avec JAX-WS :
Approche Bottom / Up (à partir d’un POJO)
POJO (Plain Old Java Object)
Créer et annoter un POJO
Compiler, déployer et tester
Le document WSDL est automatiquement généré
Approche Top / Down (à partir d’un document WSDL)
Génération des différentes classes Java (JAXB et squelette du Web
Service) en utilisant l’outil wsimport
Compléter le squelette de classe de l’implémentation
Compiler, déployer et tester
Approche Bottom up : principe
1. Définir un POJO implémentant le service
2. Ajouter l’annotation @WebService au POJO
3. Déployer l’application
4. Le document WSDL est généré automatiquement
URL du Service : [Link]
NB:
Toutes les méthode du POJO sont des opérations
du Web Service
Ne supporte pas la surcharge de méthodes
Exemple : CalculatorWS web service
Annotation
Exemple 1 : CalculatorWS
@WebService
Annote une classe Java pour définir l’implémentation du
Service Web
Annote une interface Java pour définir la description du Service
Web
Attributs de l’annotation @WebService
String name : nom du Service Web (valeur de l’attribut name de
l’élément wsdl:PortType)
String endpointInterface : nom de l’interface décrivant le Service Web
(SEI = service Endpoint Interface)
String portName : nom du endpoint ou le service est publié (valeur de
l’attribut name de l’élément wsdl:Port)
String serviceName : nom du Service Web (valeur de l’attribut name
de l’élément wsdl:service)
String targetNamespace : le namespace du Service Web
String wsdlLocation : l’emplacement du WSDL décrivant le Service
Web
@Webmethod
Annote une méthode d’une classe Java exposée comme
une opération du Service Web
Attributs de l’annotation : @WebMethod
String action : l’action de l’opération. Dans le cas d’un binding
SOAP, cela détermine la valeur de l’action SOAP
boolean exclude : précise que la méthode ne doit pas être
exposée comme une opération. Ne pas utiliser dans une
interface Java
String operationName : précise le nom de l’attribut name défini
dans l’élément operation du document WSDL
Exemple 2 : SEI Interface(Service Endpoint Interface)
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
//Service Endpoint Interface
@WebService
@SOAPBinding(style = [Link])
public interface HelloWorld
{
@WebMethod
String getHelloWorldAsString();
}
Exemple 2 : SEI Class
package [Link] ;
import [Link];
//Service Implementation Class
@WebService(endpointInterface="[Link]")
public class HelloWorldImpl implements HelloWorld
{
@Override
public String getHelloWorldAsString()
{
return "Hello World JAX-WS";
}
}
Approche Bottom up : déploiement
Différentes catégories de serveurs d’application pour gérer
les Services Web avec JAX-WS
Conteneur Web : Service Web Servlet
Nécessite une configuration explicite du Service Web
Exemple : Tomcat
Conteneur EJB : EJB Web service endpoint
Gestion respectant JSR 109
La gestion du Service Web est transparente et maintenue par
le serveur d’application
Exemple : Glassfish
Service Web (Servlet) : développement
Création d’un projet Web dynamique
Création d’un service web : Projet -> New web
service
Ajouter les opérations nécessaires
Déployer sous un conteneur Web
Service Web (Servlet) : Exemple
Java
WSDL
Service Web (Servlet) : Test
Service Web (Servlet) : Test
[Link]
La somme des deux nombres est
affichée
Service Web : EJB (JSR 109)
JSR 109 définit le modèle de programmation et l'architecture
d'exécution permettant le déploiement de services Web dans les
conteneurs EJB
J EE permet le développement de web services sous forme de
Stateless Session EJB
Service Web : EJB (JSR 109)
Stateless Session Bean
Un Stateless Session Bean est une collection de services dont
chacun est représenté par une méthode.
Stateless signifie que le service est autonome dans son exécution
et donc qu’il ne dépend pas d’un contexte particulier ou d’un
autre service.
Il n’y a pas de sauvegarde d’aucun état entre deux invocations
de méthodes.
Lorsqu’une application cliente appelle une méthode d’un
Session Bean, celui-ci exécute la méthode et retourne le
résultat.
Meilleure performance des EJBs de type stateless : plusieurs
instances utilisent la même instance d’EJB.
Choix d’un stateless EJB
Pour améliorer les performances, vous pouvez choisir
d’utiliser un Stateless Session Bean s’il a l’une de ces
caractéristiques :
L’état du Bean n’a pas de donnée spécifique à un client.
Dans un seul appel de méthodes, le Bean accomplit une tâche
générique pour tous les clients (envoi d’un email qui confirme
une commande en ligne).
Le Bean récupère d’une base de données un ensemble de
données en lecture seule qui sont souvent utilisées par les
clients.
Avantages : EJB to Web Service
Les avantages à transformer un EJB Session en
Service Web
Hétérogénéité : le client n’est pas forcément écrit en
Java
Réutilisabilité du code
Modularité : avec les annotations JAX-WS possibilité
de masquer les méthodes qui ne doivent pas être
découvertes
Service Web (EJB) : Développement
Création d’un EJB Session de type stateless ayant une interface
remote
Création d’un Service Web à partir de l’EJB
Ajouter les annotations suivantes :
@WebService : déclare l’EJB comme un service web
@WebMethod : indique que c’est une opération du service web
@WebResult : définit le nom du paramètre de sortie de la méthode
@WebParam : définit le nom du paramètre que l’on veut avoir. Par défaut
ce sera arg0, arg1…
Service Web (EJB) : Déploiement
Déployer sous un conteneur EJB (ex. Glassfish)
Le conteneur EJB s’occupe de la gestion du Service Web
Aucune Servlet n’est nécessaire
Le document WSDL est généré automatiquement en
respectant les valeurs par défauts
URL du WSDL : [Link]
Toutes les méthodes de l’EJB sont par défaut des opérations
du Service Web
Service Web (EJB) : Exemple
Annotation d’un simple POJO:
•@stateless : permettant de déclarer cette
classe en tant Stateless Session Bean
•Les deux seuls éléments obligatoires
pour définir un accès de type service web
sont les annotations @WebService et
@WebMethod.
Service Web (Servlet) vs Service Web (EJB)
En résumé l’approche Bottom-up
Le développement d’un service Web
Développement Serveur : Top/Down
A partir d’un document WSDL :
Génération des différentes classes Java (JAXB et squelette du
Web Service) en utilisant l’outil wsimport
Compléter le squelette de classe de l’implémentation
Compiler, déployer et tester
wsimport en ligne de commande
Windows :
Linux
L’approche Top-down : wsdl to java
JAXB
Java Architecture for XML Binding (JAXB)
JAXB est une spécification qui permet de faire correspondre :
Un schema XML à un ensemble de classes (désérialisation ou
unmarshalling)
Un ensemble de classes à un schema XML (sérialisation ou
marshalling)
Architecture JAXB
JAXB : marshaling/unmarshaling
Top Down : JAXB XML schema to java
Top Down : l’implémentation de l’interface
JAX-WS : Développement client
Principe
Création d’un service Web Client
Le modèle de programmation client pour JAX-WS est
appelé client Dynamic Proxy
Le client Dynamic Proxy appelle un service Web reposant
sur une interface SEI (Service Endpoint Interface)
Après la création du proxy, l'application client peut appeler
les méthodes sur le proxy
L’outil wsimport
wsimport est l’outil JAX-WS pour la programmation d’un
client dynamic proxy
L’outil wsimport génère à partir du fichier WSDL des
artefacts Java qui sont utilisés pour créer un client du service
web :
Interface SEI (Service Endpoint Interface) : représentation Java
annotée du fichier WSDL. Cette interface permet d'implémenter des
noeuds finaux JavaBeans ou de créer des instances de client Dynamic
Proxy
Classe Interface : définir les opération et les paramètres des opérations
Classe factory : définir les formats des requêtes et des réponses
Beans de données : requis pour la modélisation des données de service
web
Les artefacts wsimport
Lors de l’exécution de la commande :
wsimport -s [Link]
On obtient les interfaces et classes (artefacts) java
suivantes :
[Link]
MyWebService_Service.java
[Link]
[Link]
[Link]
[Link]
Codage du client
Utiliser la classe généré [Link].
MyWebService _Service qui représente le service au niveau de
l’URI du fichier wsdl déployé.
import [Link];
import [Link];
public class ServiceClient { @WebServiceRef(wsdlLocation =
"META-INF/wsdl/localhost/mywebservice/[Link]")
private static MyWebService_Service service;
Codage du client
Retrouver le proxy du service, appelé également port, en
invoquant la méthode getMyWebServicePort du service:
MyWebService port = [Link]();
Le port implémente le SEI (Service Endpoint Interface)
défini par le service
Invoquer le port myMethod :
return [Link](arg0);
Dynamic Proxy Client : CaclulatorWS
CalculatorWS
WSDL
Dynamic Proxy Client : CaclulatorWS
Exemple (TP) : projet client CalculatorWS
Business
Interface
Factory class
Les annotations JAX-WS
Annotations JAX-WS
JAX-WS repose sur l’utilisation massive d’annotations pour la
configuration d’un Service Web
Les annotations utilisées par JAX-WS sont définies dans des
JSRs séparées :
JSR 224 : JAX-WS
JSR 181 : Web Services Metadata
JSR 222 : JAXB
JSR 250 : Common Annotations
Les annotations de JSR 2241
• JAX-WS Annotations (JSR 224 )
• @ Action
• @ BindingType
• @ FaultAction
• @ ServiceMode
• @RequestWrapper
• @ResponseWrapper
• @WebEndpoint
• @WebFault
• @WebServiceClient
• @WebServiceRef
1[Link]
Les annotations des JSR 222 et 2501
JAXB annotations (JSR-222)
@ XmlAccessorType
@ XmlElement
@ XmlRootElement
@ XmlSeeAlso
@ XmlType
Common annotations (JSR-250)
@ Resource
@ PostConstruct
@ PreDestroy
1[Link]
Les annotations du JSR 1811
• Web Services Metadata Annotations (JSR 181)
@WebService : Implémentation d’un Service Web
@WebMethod : Paramétrer une opération
@WebParam : Paramétrer un message
@WebResult : Paramétrer un message de sortie
@WebFault : Paramétrer un message fault
• @ HandlerChain
• @ SOAPBinding
→ A noter que seule l’utilisation de l’annotation @WebService
est nécessaire (utilisation de valeurs par défaut)
1[Link]
@WebParam
Décrit la relation entre un paramètre d’entrée d’une
méthode et un message part d’une opération
Attributs de l’annotation :
boolean header : précise si le paramètre doit être transmis
dans l’en-tête du message (true ) ou dans le corps (false)
[Link] mode : précise le type d’accès au paramètre
(IN, OUT ou INOUT)
String name : nom du paramètre
String partName : le nom du wsdl:part représentant ce
paramètre
String targetNamespace : l’espace de nommage de ce
paramètre
@WebResult
Décrit la relation entre le paramètre de sortie d’une
méthode et un message part d’une opération
Attributs de l’annotation :
boolean header : précise si le paramètre de sortie doit être
transmis dans l’en-tête du message (true) ou dans le corps
(false)
String name : nom du paramètre de sortie
String partName : le nom du wsdl:part représentant ce
paramètre de sortie
String targetNamespace : l’espace de nommage de ce
paramètre de sortie
Bibliographie
Antonio Goncalves. Beginning Java EE 6 with
GlassFish 3. Edition Apress, 2010.
Frédéric Chuong, Olivier Corgeron, Cyril Joui,
Jean-Baptiste Renaux et Maxime Vialette. EJB 3,
du concept à l’écriture du code. Guide du
Développeur. Edition Dunod, 2010.
Carol McDonald. Metro, JAX-WS, WSIT, et
REST. Sun’s MicroSystems Tutorial, 2009.
Netographie (2015)
IBM Knowledge Center :
[Link]
Oracle Java documentation, Docs Oracle
[Link]
JAX-WS avec Netbeans
[Link]
Annexe
L’outil wsgen
L’outil wsgen génère des artifacts (JAXB, WSDL) à
partir de classes Java annotées via JAX-WS
L’utilisation de cet outil n’est pas obligatoire puisque cette
génération est implicite lors de l’exécution
Exemples d’utilisation
Générer les classes java annotées JAXB (marshall, unmarshall)
wsgen nom_service -keep
Générer le WSDL
wsgen nom_service –keep –wsdl