Développement de services Web JAX-WS avec des annotations
JAX-WS prend en charge deux différents types d'implémentation de noeud final de service, l'interface SEI Web standard et une nouvelle interface Provider de telle sorte que les services fonctionnent au niveau des messages XML. En utilisant des annotations sur l'implémentation de noeud final de service ou sur le client, vous pouvez définir le point final de service comme un service Web.
Avant de commencer
Configurez un environnement de développement pour les services Web.
Pourquoi et quand exécuter cette tâche
Cette tâche constitue une étape obligatoire dans le processus de développement de services Web JAX-WS.
La technologie JAX-WS prend en charge l'implémentation des services Web sur l'interface SEI standard et sur une nouvelle interface fournisseur. Les noeuds finaux JAX-WS sont similaires aux implémentations de noeud final dans la spécification JAX-RPC (Java API for XML-based RPC). Contrairement à JAX-RPC, l'interface SEI (Service Endpoint Interface) est facultative pour les services Web JAX-WS. Les services JAX-WS ne disposant pas d'une interface SEI sont considérés comme ayant une interface SEI implicite, alors que les services ayant une interface SEI associée sont considérés comme ayant une interface SEI explicite. Les interfaces SEI requises par JAX-WS sont également plus génériques que les interfaces SEI requises par JAX-RPC. Avec JAX-WS, l'interface SEI n'est pas requise pour l'extension de l'interface java.rmi.Remote, comme cela est requis par la spécification JAX-RPC.
Le modèle de programmation JAX-WS utilise également la prise en charge des annotations des classes Java en recourant à des métadonnées pour définir une implémentation de noeud final de service en tant que service Web et pour indiquer la manière dont un client accède au service Web. JAX-WS prend en charge les 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.0 (JSR 224), qui inclut les annotations Java Architecture for XML Binding (JAXB). A l'aide des annotations, l'implémentation de noeud final de service peut décrire indépendamment le service Web sans qu'un fichier WSDL ne soit requis. Les annotations peuvent fournir toutes les informations WSDL nécessaires à la configuration de l'implémentation du noeud final de service ou du client des services Web. Vous pouvez spécifier des annotations sur l'interface SEI utilisée par le client et le serveur, ou sur la classe d'implémentation de service au niveau serveur.
Pour plus de détails sur les standards et les spécifications pris en charge, voir les spécifications des services Web et la documentation des API.
Lors du développement d'un service Web JAX-WS à partir d'une classe Java existante, ce qui est un mode de développement connu sous le nom de développement ascendant, vous devez annoter la classe avec une annotation @WebService (javax.jws.WebService) @WebServiceProvider (javax.xml.ws.Provider) pour la définir initialement comme un service Web. L'annotation @WebService définit le service comme un noeud final SEI, tandis que l'annotation @WebServiceProvider le définit comme un noeud final fournisseur.
- Développez des services Web JAX-WS SEI
Pour un noeud final SEI, l'interface SEI (Service Endpoint Interface), qu'il s'agisse d'une classe ou d'une interface Java, déclare les méthodes métier fournies par un service Web spécifique. Les seules méthodes sur un noeud final JAX-WS pouvant être appelées par un client de services Web sont les méthodes métier définies dans l'interface SEI explicite ou implicite.
Pour tous les noeuds finaux SEI, l'annotation @WebService doit être incluse dans la classe d'implémentation. Si l'implémentation de service utilise une interface SEI explicite, cette interface doit être référencée par l'attribut endpointInterface dans l'annotation @WebService. Si l'implémentation de service n'utilise pas d'interface SEI explicite, le service est alors décrit implicitement par la classe d'implémentation et constitue une interface SEI implicite.
- Développez des services Web JAX-WS à l'aide de l'interface fournisseur
Le modèle de programmation JAX-WS introduit l'interface fournisseur destinée aux noeud finaux fournisseur, javax.xml.ws.Provider, en tant qu'alternative dynamique aux noeuds finaux SEI. L'interface fournisseur prend en charge une approche plus orientée messagerie pour les services Web. Avec l'interface fournisseur, vous pouvez créer une classe Java qui implémente une simple interface pour générer une classe d'implémentation de service générique. L'interface fournisseur définit une méthode, la méthode invoke, qui utilise des éléments génériques pour contrôler les types d'entrée et de sortie lors d'une utilisation avec différents messages ou charges de message. Tous les noeuds finaux Provider doivent être annotés avec l'annotation @WebServiceProvider (javax.xml.ws.WebServiceProvider). Une implémentation de service ne peut pas spécifier l'annotation @WebService si elle implémente l'interface javax.xml.ws.Provider.
En commençant par WebSphere Application Server version 7.0 et ultérieure, les modules d'application Java EE 5 (modules d'application Web version 2.5 ou ultérieure ou les modules EJB version 3.0 ou ultérieure) sont analysés pour connaître les annotations permettant d'identifier les services et clients JAX-WS. Toutefois, les modules d'application antérieurs à Java EE 5 (modules d'application Web version 2.4 ou antérieure, ou modules EJB version 2.1 ou antérieure) ne font pas l'objet d'une analyse des annotations JAX-WS, par défaut, pour des raisons de performance. Dans la version 6.1 de Feature Pack for Web Services, le comportement par défaut consiste à analyser les modules d'application Web antérieurs à Java EE 5 pour identifier les services JAX-WS et à rechercher dans les modules d'application Web antérieurs à Java EE 5 et dans les modules EJB des clients de service au cours de l'installation de l'application. Dans la mesure où le comportement par défaut de WebSphere Application Server version 7.0 et ultérieure consiste à ne pas rechercher les annotations dans les modules antérieurs à Java EE 5 au cours de l'installation de l'application ou du démarrage du serveur, si vous souhaitez conserver la compatibilité antérieure avec le module de fonctions, vous devez configurer soit la propriété UseWSFEP61ScanPolicy dans l'élément META-INF/MANIFEST.MF d'un fichier WAR ou d'un module EJB, soit définir la propriété personnalisée de machine virtuelle Java, com.ibm.websphere.webservices.UseWSFEP61ScanPolicy, sur les serveurs pour en demander l'analyse pendant l'installation de l'application et le démarrage du serveur. Pour en savoir plus sur l'analyse des annotations, voir les informations relatives aux annotations JAX-WS.
Procédure
Résultats
Vous avez défini l'implémentation de noeud final de service qui représente l'application des services Web. Pour en savoir plus sur les annotations JAX-WS prises en charge, consultez la documentation sur les annotations JAX-WS.
Exemple d'implémentation de noeud final de service et d'interface JavaBeans
/** This is an excerpt from the service implementation file, EchoServicePortTypeImpl.java.
package com.ibm.was.wssample.echo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
@javax.jws.WebService(serviceName = "EchoService", endpointInterface =
"com.ibm.was.wssample.echo.EchoServicePortType", targetNamespace="http://com/ibm/was/wssample/echo/",
portName="EchoServicePort")
public class EchoServicePortTypeImpl implements EchoServicePortType {
public EchoServicePortTypeImpl() {
}
public String echo(String obj) {
String str;
....
str = obj;
....
return str;
}
}
/** This is a sample EchoServicePortType.java service interface. */
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.*;
@WebService(name = "EchoServicePortType", targetNamespace = "http://com/ibm/was/wssample/echo/",
wsdlLocation="WEB-INF/wsdl/Echo.wsdl")
public interface EchoServicePortType {
/** ...the method process ...*/
@WebMethod
}
package jaxws.provider.source;
import javax.xml.ws.Provider;
import javax.xml.ws.WebServiceProvider;
import javax.xml.transform.Source;
@WebServiceProvider()
public class SourceProvider implements Provider<Source> {
public Source echo(Source data) {
return data;
}
}
Dans l'exemple d'implémentation Provider, le type javax.xml.transform.Source est spécifié dans la méthode <Source> générique. La méthode <Source> générique définit les types d'entrée et de sortie comme des objets Source.
Que faire ensuite
Développez les artefacts Java pour des applications JAX-WS à partir de JavaBeans. Pour plus de détails, consultez les informations sur la génération des artefacts Java pour des applications JAX-WS.