JAX-WS
Java™ API for XML-Based Services (JAX-WS) est le modèle de programmation de services Web nouvelle génération qui complète le modèle de base fourni par le modèle de programmation Java API for XML-based RPC (JAX-RPC). L'utilisation de JAX-WS simplifie le développement des clients et services Web à l'aide d'une plus grande indépendance de plateforme pour les applications Java via l'utilisation de proxy dynamiques et d'annotations Java.
JAX-WS est un modèle de programmation visant à simplifier le développement d'application grâce à la prise en charge d'un modèle standard basé sur les annotations qui permet de développer les clients et les applications de services Web. La technologie JAX-WS s'aligne de façon stratégique sur la tendance en cours du secteur d'activité vers un modèle de messagerie davantage orienté document et remplace le modèle de programmation d'appel de procédure éloignée, comme défini par JAX-RPC. Le modèle de programmation et les applications JAX-RPC sont toujours pris en charge par ce produit, mais JAX-RPC comporte des limitations et ne prend pas en charge plusieurs services complexes orientés document. JAX-WS est le modèle de programmation stratégique pour le développement des services Web et constitue un élément requis de la plateforme Java EE 6 (Java Platform, Enterprise Edition 6). JAX-WS est également connu sous le nom JSR 224.
La spécification JAX-WS 2.2 remplace et inclut des fonctions de la spécification JAX-WS 2.1. JAX-WS 2.2 ajoute le support côté client pour l'utilisation des annotations en rapport avec WebServiceFeature, telles que @MTOM et @Addressing, et des annotations @RespectBinding. Le support de ces annotations était déjà disponible côté serveur à compter de la version 2.1 de JAX-WS. Désormais, vous pouvez activer et configurer le support WS-Addressing sur un client ou un service en ajoutant des vérifications WS-Policy dans le document WSDL. La spécification Web Services for Java EE 1.3 introduit également le support de ces annotations WebServiceFeature, ainsi que le support permettant d'utiliser des éléments du descripteur de déploiement pour configurer ces fonctions à la fois sur le client et sur le serveur. JAX-WS 2.2 nécessite JAXB (Java Architecture for XML Binding) version 2.2 pour la liaison de données.
L'implémentation de la norme de programmation JAX-WS fournit les améliorations suivantes pour le développement de clients et services web :
- Meilleure indépendance vis à vis de la plateforme pour les applications Java.
L'utilisation des API JAX-WS simplifie le développement des clients et services Web grâce à une meilleure indépendance vis-à-vis des plateformes pour les applications Java. JAX-WS tire parti du mécanisme de proxy dynamique pour fournir un modèle de délégation formel comportant un fournisseur connectable. Il s'agit d'une amélioration par rapport JAX-RPC, qui se repose sur la génération de raccords propres au fournisseur pour les appels.
- Annotations
JAX-WS fournit de support de l'annotation des classes Java à l'aide de métadonnées, pour indiquer que la classe Java est un service Web. JAX-WS prend en charge l'utilisation des annotations basées sur la spécification Metadata Facility for the Java Programming Language (JSR 175), la spécification Web Services Metadata for the Java Platform (JSR 181) et les annotations définies par la spécification JAX-WS 2.2. L'utilisation d'annotations dans la source Java et dans la classe Java simplifie le développement de services Web. Utilisez des annotations pour définir les informations qui sont généralement spécifiées dans des fichiers de descripteur de déploiement, des fichiers WSDL ou du mappage de métadonnées à partir de fichiers XML et WSDL vers les artefacts source.
Par exemple, vous pouvez incorporer une balise @WebService simple dans la source Java pour exposer le bean sous la forme d'un service Web.
L'annotation @WebService indique à l'environnement d'exécution du serveur d'exposer toutes les méthodes publiques sur ce bean sous forme de service Web. D'autres niveaux de granularité peuvent être contrôlés via l'ajout d'annotations supplémentaires dans des méthodes ou paramètres individuels. L'utilisation d'annotations simplifie considérablement l'exposition d'artefacts Java sous forme de services Web. En outre, dans la mesure où les artefacts sont créés à partir de l'utilisation de quelques-uns des outils de mappage descendant en démarrant à l'aide d'un fichier WSDL, des annotations sont incluses dans les classes source et Java afin de capturer les métadonnées conjointement avec les fichiers source.@WebService public class QuoteBean implements StockQuote { public float getQuote(String sym) { ... } }
L'utilisation d'annotations améliore également le développement de services web au sein d'une structure d'équipe car il n'est pas nécessaire de définir tous les services web dans un descripteur de déploiement unique ou commun, comme dans le cas des services web JAX-RPC. Le fait de tirer parti des annotations avec les services web JAX-WS permet le développement parallèle du service et des métadonnées requises.
Pour les services Web JAX-WS, l'utilisation du descripteur de déploiement webservices.xml est facultatif car vous pouvez utiliser des annotations pour spécifier toutes les informations contenues dans le fichier de descripteur de déploiement. Vous pouvez utiliser ce fichier pour augmenter ou remplacer des annotations JAX-WS existantes. Toutes les informations que vous définissez dans le descripteur de déploiement webservices.xml remplacent les informations correspondantes spécifiées par les annotations.
Par exemple, si votre classe d'implémentation de services pour vos services web JAX-WS inclut ce qui suit :- l'annotation @WebService :
@WebService(wsdlLocation=”http://myhost.com/location/of/the/wsdl/ExampleService.wsdl”)
- le fichier webservices.xml spécifie un nom de fichier différent pour le document WSDL comme suit :
<webservices> <webservice-description> <webservice-description-name>ExampleService</webservice-description-name> <wsdl-file>META-INF/wsdl/ExampleService.wsdl</wsdl-file> ... </webservice-description> </webservices>
- l'annotation @WebService :
- Appel asynchrone des services Web
Dans JAX-WS, les services Web sont appelés de façon synchrone et asynchrone. JAX-WS ajoute un support pour un mécanisme d'interrogation et de rappel lors de l'appel asynchrone des services Web. En utilisant un modèle d'interrogation, le client peut émettre une demande et obtenir en retour un objet réponse qui est interrogé pour déterminer si le serveur a répondu. Lorsque le serveur répond, la réponse réelle est extraite. Le modèle de rappel permet au client de fournir un gestionnaire d'appel pour accepter et traiter l'objet réponse entrante. Les modèles d'interrogation et de rappel permettent au client de se concentrer sur les tâches qu'il doit effectuer sans attendre une réponse en retour, tout en fournissant un modèle plus dynamique et efficace pour appeler les services Web.
Par exemple, une interface de service web peut comporter des méthodes pour les demandes synchrones et asynchrones. Les demandes asynchrones sont identifiées en gras dans l'exemple suivant :@WebService public interface CreditRatingService { // sync operation Score getCreditScore(Customer customer); // async operation with polling Response<Score> getCreditScoreAsync(Customer customer); // async operation with callback Future<?> getCreditScoreAsync(Customer customer, AsyncHandler<Score> handler); }
L'appel asynchrone qui utilise le mécanisme de rappel nécessite une entrée supplémentaire de la part du programmeur client. Le rappel est un objet contenant le code d'application qui est exécuté lorsqu'une réponse asynchrone est reçue. Utilisez l'exemple de code suivant pour invoquer un gestionnaire d'appel asynchrone :CreditRatingService svc = ...; Future<?> invocation = svc.getCreditScoreAsync(customerFred, new AsyncHandler<Score>() { public void handleResponse ( Response<Score> response) { Score score = response.get(); // do work here... } } );
Utilisez l'exemple de code suivant pour invoquer un client d'interrogation asynchrone :CreditRatingService svc = ...; Response<Score> response = svc.getCreditScoreAsync(customerFred); while (!response.isDone()) { // Complete an action while we wait. } // No cast needed, because of generics. Score score = response.get();
- Utilisation de l'injection de ressource
JAX-WS prend en charge l'injection de ressource pour simplifier davantage le développement de services Web. JAX-WS utilise cette fonction clé de Java EE 5 pour déplacer la charge représentée par la création et l'initialisation de ressources communes dans un environnement d'exécution Java de votre application de services Web vers l'environnement de conteneur d'application proprement dit. JAX-WS fournit un support pour un sous-ensemble d'annotations définies dans JSR-250 pour l'injection de ressource et le cycle de vie de l'application dans son environnement d'exécution.
Le serveur d'applications prend également en charge la syntaxe de l'annotation @Resource ou @WebServiceRef pour déclarer des clients gérés JAX-WS et pour demander l'injection de services et de ports JAX-WS. Quand l'une de ces annotations est utilisée dans une zone ou une méthode, une instance de service ou de port JAX-WS est alors injectée. La syntaxe de ces annotations entraîne également la liaison du type spécifié par l'annotation dans l'espace de nom JNDI.
L'annotation @Resource est définie par la spécification relative aux annotations communes JSR-250 qui est incluse dans Java EE 5 (Java Platform, Enterprise Edition 5). En plaçant l'annotation @Resource sur une variable detype javax.xml.ws.WebServiceContext au sein d'une implémentation de noeud final de service, vous pouvez demander une injection de ressource et collecter l'interface javax.xml.ws.WebServiceContext liée à cet appel de noeud final particulier. A partir de l'interface WebServiceContext, vous pouvez collecter MessageContext pour la demande associée à l'appel de méthode particulier utilisant la méthode getMessageContext().
L'annotation @WebServiceRef est définie par la spécification JAX-WS.
L'exemple suivant illustre l'utilisation des annotations @Resource et @WebServiceRef pour l'injection de ressource :@WebService public class MyService { @Resource private WebServiceContext ctx; @Resource private SampleService svc; @WebServiceRef private SamplePort port; public String echo (String input) { … } }
Pour plus d'informations sur l'injection de ressources, reportez-vous aux sections 5.2.1 et 5.3 de la spécification JAX-WS.
- Liaison de données avec JAXB 2.2
JAX-WS exploite l'API et les outils JAXB (Java Architecture for XML Binding) 2.2 comme technologie de liaison pour les mappages entre les objets Java et les documents XML. Les outils JAX-WS comptent sur les outils JAXB pour la liaison de données par défaut permettant des mappages bidirectionnels entre les objets Java et les documents XML. La liaison de données JAXB remplace la liaison de données décrite par la spécification JAX-RPC.
JAX-WS 2.2 requiert JAXB 2.2 pour la liaison des données. JAXB 2.2 fournit des extensions mineures à ses annotations pour améliorer la génération de schéma et offrir de meilleures caractéristiques d'intégration avec JAX-WS.
- Clients dynamiques et statiques
L'API de client dynamique pour JAX-WS est appelée client Dispatch (javax.xml.ws.Dispatch). Le client Dispatch est un client orienté messagerie XML. Les données sont envoyées en mode PAYLOAD ou MESSAGE. En mode PAYLOAD, le client Dispatch est chargé uniquement de fournir le contenu de l'élément <soap:Body>, puis JAX-WS ajoute les éléments <soap:Envelope> et <soap:Header>. En mode MESSAGE, le client Dispatch est chargé de fournir l'intégralité de l'enveloppe SOAP, y compris les éléments <soap:Envelope>, <soap:Header> et <soap:Body>. JAX-WS n'ajoute rien d'autre au message. Le client Dispatch prend en charge les appels asynchrones à l'aide d'un mécanisme de rappel ou d'interrogation.
Le modèle de programmation client statique pour JAX-WS est appelé client proxy. Ce dernier appelle un service web basé sur une interface de noeud final de service (SEI) qui doit être fournie.
- Prise en charge de MTOM
JAX-WS permet d'envoyer des pièces jointes binaires, telles que des images ou fichiers conjointement avec des demandes de services Web. JAX-WS ajoute un support pour la transmission optimisée de données binaires, comme défini par le mécanisme MTOM (Message Transmission Optimization Mechanism).
- Technologies de liaison de données multiples
JAX-WS présente les technologies de liaison suivantes à l'utilisateur final : XML Source, SOAP Attachments API for Java (SAAJ) 1.3 et Java Architecture for XML Binding (JAXB) 2.2. XML Source permet aux utilisateurs de transmettre à l'environnement d'exécution un javax.xml.transform.Source représentant les données d'un objet Source à traiter. SAAJ 1.3 permet désormais de transmettre un document SOAP entier via l'interface, à la place de la charge proprement dite. Cette opération est effectuée par le client qui transmet l'objet SAAJ SOAPMessage via l'interface. JAX-WS tire parti du support JAXB 2.2 en tant que technologie de liaison de données de choix entre Java et XML.
- Prise en charge de SOAP 1.2
La prise en charge de SOAP 1.2 a été ajoutée dans JAX-WS 2.0. JAX-WS prend en charge SOAP 1.1 et SOAP 1.2 de sorte que vous puissiez envoyer des pièces jointes binaires, telles que des images ou fichiers conjointement avec des demandes de services Web. JAX-WS ajoute un support pour la transmission optimisée de données binaires, comme défini par le mécanisme MTOM.
- Outils de développement
JAX-WS fournit les outils de ligne de commande wsgen et wsimport pour la génération d'artefacts portables pour les services web JAX-WS. Lors de la création de services web JAX-WS, vous pouvez démarrer à l'aide d'un fichier WSDL ou d'une classe de bean d'implémentation. Si vous démarrez à l'aide d'une classe de bean d'implémentation, utilisez l'outil de ligne de commande wsgen pour générer tous les artefacts de serveur de services Web, y compris un fichier WSDL, le cas échéant. Si vous démarrez à l'aide d'un fichier WSDL, utilisez l'outil de ligne de commande wsimport pour générer tous les artefacts de services web du serveur ou du client. L'outil de ligne de commande wsimport traite le fichier WSDL à l'aide de définitions de schéma, afin de générer les artefacts portables, qui comprennent la classe de service, la classe d'interface de noeud final de service et les classes JAXB 2.2 du schéma XML correspondant.
- Prise en charge des protocoles de services
Web pour Java EE version 1.3
La spécification Web Services for Java EE version 1.3 ajoute la prise en charge de la configuration des fonctions MTOM, Addressing, et RespectBinding pour les services et les clients JAX-WS, par l'utilisation des annotations et des entrées de descripteur de déploiement.
- Support targetNamespace vide pour le type de paramètre WRAPPED et types de retoursJAX-WS 2.2 prévoit le support des paramètres et des types de retour des méthodes. Dans JAX-WS, vous pouvez définir une opération de service Web avec un paramètre d'opération et un type de retour optionnel. Si le paramètre d'opération et le type de retour définissent une propriété targetNamespace vide en spécifiant la valeur "" pour cette propriété, avec soit l'annotation @WebParam, soit l'annotation @WebResult, l'environnement d'exécution JAX-WS se comporte de la façon suivante :
- Si l'opération est de type document, le style de paramètre est WRAPPED et le paramètre n'est pas mappé à un en-tête. Un espace de nom vide est alors mappé aux paramètres d'opération et types de retours.
- Si le type de paramètre n'est pas WRAPPED, la valeur du paramètre targetNamespace définie en utilisant l'annotation @WebParam ou @WebResult est utilisée.