Web Services Addressing (WS-Addressing) favorise l'interopérabilité entre les services Web
en définissant un moyen standard de traiter les services Web et de fournir des informations d'adressage dans les messages. Cette tâche décrit les étapes nécessaires à la création d'un service Web JAX-WS auquel on accède à l'aide d'une référence de noeud final WS-Addressing. Cette tâche décrit également les étapes supplémentaires nécessaires pour utiliser des ressources avec état dans le cadre du service Web.
Avant de commencer
La procédure décrite ici s'applique aux serveurs et aux clients qui s'exécutent sur WebSphere
Application Server.
Pourquoi et quand exécuter cette tâche
Effectuez cette tâche si vous créez un service Web JAX-WS qui utilise la spécification WS-Addressing. Cette tâche utilise les interfaces WS-Addressing JAX-WS pour créer la référence de noeud final requise. Vous pouvez également créer des références de noeuds finals à l'aide de l'interface WS-Addressing d'IBM et les convertir en objets d'interface JAX-WS à utiliser avec le reste de l'application.
Procédure
- Mettez en place une interface de service Web qui retourne une référence de noeud final au service cible.
L'interface doit renvoyer une référence de noeud final, en utilisant une opération de
fabrique ou un service de la fabrique distinct. Le service cible peut présenter une
instance de ressource, par exemple un panier.
- Implémentez le service Web créé à l'étape précédente.
Pour la partie
WS-Addressing de l'implémentation, procédez comme suit :
- Facultatif : Ajoutez des annotations pour spécifier le comportement de WS-Addressing. Voir Annotations de l'adressage des services Web pour plus de détails.
- Facultatif : Si votre interface implique un service Web qui présente une instance de ressource,
créez ou recherchez l'instance de ressource.
- Facultatif : Si vous utilisez une instance de ressource, récupérez l'identifiant de la ressource. L'ID ressource dépend de l'application et peut être généré lors de la création de
l'instance de ressource.
Avertissement : N'incluez pas d'informations sensibles dans l'identifiant de ressource, car celui-ci est propagé dans le message SOAP.
- Créez une référence de noeud final qui référence le service Web en suivant les instructions indiquées dans Création de références de noeud final à l'aide de l'API JAX-WS de Web Services Addressing. Si vous utilisez une instance de ressource, faites passer l'identifiant de la ressource comme paramètre.
- Renvoyez la référence de noeud final.
- Si votre service Web utilise des instances de ressource, étendez
l'implémentation pour faire correspondre les messages entrants aux instances de ressource
appropriées. Comme vous avez associé l'ID ressource à la référence de noeud final créée
précédemment, tous les messages entrants ciblés sur la référence de noeud final
contiendront les informations d'ID ressource sous forme de paramètre de la référence dans
l'en-tête SOAP du message. Comme l'ID ressource est transmis dans
l'en-tête SOAP, il n'est pas nécessaire de le présenter sur l'interface de service Web.
Lorsque WebSphere
Application Server reçoit le message, il place ces informations dans le
contexte du message sur l'unité d'exécution. Etendez l'implémentation pour effectuer les opérations suivantes :
- Récupérez l'identifiant de l'instance de ressource depuis le contexte du message.
- Si vous utilisez l'espace de nom WS-Addressing 2005/08, utilisez la propriété REFERENCE_PARAMETERS
de la classe MessageContext (contexte de message).
- Si vous utilisez l'espace de nom WS-Addressing 2004/08, vous devez utiliser l'interface WS-Addressing d'IBM, en particulier la méthode EndpointReferenceManager.getReferenceParameterFrom
MessageContext(QName resource_id).
Utilisez la méthode suivante pour l'espace de nom 2005/08 :...
List resourceIDList = (List)getContext().getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);
...
Utilisez la méthode suivante pour l'espace de nom 2004/08 :...
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
...
- Réacheminez le message vers l'instance de ressource appropriée.
- Facultatif : Configurez un client proxy pour communiquer avec le service.
- Utilisez l'outil wsimport ou xjc pour générer les artefacts requis par le client.
Remarque : Si vous voulez utiliser la spécification WS-Addressing 2004/08, spécifiez le fichier de liaison fourni, racine_serveur_app/util/SubmissionEndpointReference.xjb,
comme paramètre -b de l'outil. Ce paramètre indique à l'outil de générer des objets de référence de noeud final à l'aide de la classe SubmissionEndpointReference qui fait partie de l'implémentation IBM de l'interface JAX-WS standard. Si vous ne spécifiez pas ce fichier de liaisons, les objets de référence de noeuds finals conséquents ne fonctionneront pas avec l'interface JAX-WS standard.
- Dans le code client, créez une instance de la classe de service.
- Récupérez un objet proxy à partir de la classe de service. Il existe plusieurs façons d'utiliser l'interface JAX-WS pour récupérer des objets proxy. Par exemple, il existe plusieurs méthodes getPort sur la classe de service et une sur la classe EndpointReference. Pour plus d'informations, consultez la documentation API.
- Facultatif : Utilisez la caractéristique Addressing ou SubmissionAddressing
pour activer la prise en charge de WS-Addressing. Par exemple, créez un proxy en utilisant la méthode getPort qui accepte les caractéristiques de service Web comme paramètre. Si vous préférez, vous pouvez activer la prise en charge de WS-Addressing à l'aide d'une autre méthode, comme par exemple des ensembles de règles. Pour plus d'informations, voir Activation de la prise en charge de Web Services Addressing pour les applications JAX-WS.
- Utilisez l'objet proxy pour appeler la méthode de service qui retourne la référence de noeud final.
Le code d'exemple suivant indique un client qui appelle un service web pour ajouter deux nombres. Le service Web émet un ticket (l'identifiant de la ressource) pour le client et exige que le client utilise ce ticket lorsqu'il appelle le service Web.
Le client crée deux proxy. Le premier proxy obtient le ticket comme référence de noeud final de la part du service. Le second proxy utilise la classe AddressingFeature pour activer WS-Addressing pour la spécification 2005/08 et appelle le service pour ajouter deux nombres.
...
CalculatorService service = new CalculatorService();
// Create the first proxy
Calculator port1 = service.getCalculatorServicePort();
// Obtain the ticket as an endpoint reference from the service
W3CEndpointReference epr = port1.getTicket();
// Create the second proxy, using an addressing feature to enable WS-Addressing
Calculator port2 = epr.getPort(Calculator.class, new AddressingFeature());
// Invoke the service to add the numbers
int answer = port2.add(value0, value1);
System.out.println("The answer is: " + answer);
...
Remarque : Si les métadonnées de la référence de noeud final sont en conflit avec les informations déjà associées au message sortant, par exemple si l'objet proxy est configuré de façon à représenter une interface différente, une exception javax.xml.ws.WebServiceException
est générée lors des tentatives d'appel du noeud final.
Si vous voulez paramétrer des propriétés d'adressage des messages, telles qu'une réponse à un noeud final, vous devez utiliser l'interface SPI WS-Addressing d'IBM et la classe BindingProvider tel qu'indiqué dans Spécification et acquisition de propriétés d'adressage de message à l'aide des interfaces SPI WS-Addressing propriétés d'IBM..
- Facultatif : Configurez un client Dispatch pour communiquer avec le service. Vous pouvez configurer un client de différentes façons ; les étapes suivantes décrivent un exemple.
- Créez une instance du service.
- Ajoutez un port à l'objet service.
- Créez une instance de la classe Dispatch, en passant par la référence de noeud final.
- Créez un objet Dispatch. Utilisez la méthode Service.createDispatch
avec les paramètres suivants :
Il existe plusieurs variantes de la méthode Service.createDispatch ; consultez la documentation API pour en savoir plus.
- Composez le message de demande du client.
- Appelez le noeud final du service avec le client Dispatch.
Le code suivant indique un exemple de fragment d'un client Dispatch qui active WS-Addressing 2004/08....
CalculatorService service = new CalculatorService();
Dispatch(<SOAPMessage> dispatch = service.createDispatch(
endpointReference,
SOAPMessage.class,
Service.Mode.MESSAGE,
new SubmissionAddressingFeature(true));
...