Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
enseignement:tp:sw:handlers:2013 [2013/10/09 06:03]
ecoquery créée
enseignement:tp:sw:handlers:2013 [2013/10/17 11:07] (Version actuelle)
ecoquery
Ligne 13: Ligne 13:
 ===== Exemple ===== ===== Exemple =====
  
-Créer une classe ''tiw5.metier.services.handlers.SimpleLogHandler'' contenant le code suivant:+Créer une classe ''sw.wine.services.handlers.SimpleLogHandler'' contenant le code suivant:
 <code java SimpleLogHandler.java> <code java SimpleLogHandler.java>
-package tiw5.metier.services.handlers;+package sw.wine.services.handlers;
  
 import javax.xml.ws.handler.LogicalHandler; import javax.xml.ws.handler.LogicalHandler;
Ligne 49: Ligne 49:
 </code> </code>
  
-Créer un fichier ''src/main/resources/tiw5/metier/services/soap/handler-chains.xml'' contenant:+Créer un fichier ''src/main/resources/sw/wine/services/handler-chains.xml'' contenant:
 <code xml handler-chains.xml> <code xml handler-chains.xml>
 <?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
Ligne 55: Ligne 55:
   <handler-chain>   <handler-chain>
     <handler>     <handler>
-      <handler-name>tiw5.metier.services.handlers.SimpleLogHandler</handler-name> +      <handler-name>sw.wine.services.handlers.SimpleLogHandler</handler-name> 
-      <handler-class>tiw5.metier.services.handlers.SimpleLogHandler</handler-class>+      <handler-class>sw.wine.services.handlers.SimpleLogHandler</handler-class>
     </handler>     </handler>
     <!-- handler>     <!-- handler>
Ligne 66: Ligne 66:
 </code> </code>
  
-Ajouter l'annotation ''<nowiki>@HandlerChain(file="handler-chains.xml")</nowiki>'' dans la classe ''tiw5.metier.services.soap.JPATestService'', déployer les services sous JBoss et tester l'affichage dans les log en appelant le service avec SOAPUI.+Ajouter l'annotation ''<nowiki>@HandlerChain(file="handler-chains.xml")</nowiki>'' dans la classe ''sw.wine.services.WineStorage'', déployer le service et tester l'affichage dans les log en appelant le service avec SOAPUI.
  
 ===== Clients ===== ===== Clients =====
  
-Créer une classe ''tiw5.modele.Client'' dans le projet ''modele'':+Créer une classe ''sw.wine.model.user.Client'' dans le projet ''modele'':
 <code java Client.java> <code java Client.java>
-package tiw5.modele;+package sw.wine.model.user;
  
 import javax.persistence.Entity; import javax.persistence.Entity;
Ligne 120: Ligne 120:
 } }
 </code> </code>
-Si le besoin s'en fait sentir, ne pas hésiter à créer une classe ''tiw5.modele.dao.ClientDAO'' pour gérer les clients.+Si le besoin s'en fait sentir, ne pas hésiter à créer une classe ''sw.wine.model.user.dao.ClientDAO'' pour gérer les clients.
  
 ===== Handler de log ===== ===== Handler de log =====
  
-Mettre en place une chaîne de //handlers// pour le service de location que vous avez implémenté pour le [[enseignement:tp:sw:jaxrs-jaxws|TP3]] et y ajouter le handler de Log utilisé pour le service JPATestService.+Mettre en place une chaîne de //handlers// pour le service de livraison (une des versions utilisant CXF) que vous avez implémenté pour le [[enseignement:tp:sw:fournisseur:2013|TP3]] et y ajouter le handler de Log utilisé pour le service WineStorage.
  
-Modifier ce handler pour afficher le nom de l'élément principal du message transmis.+Pour cela on créera un nouveau module ''handlers'' en lancant <code>mvn archetype:generate -DinteractiveMode=false -DartifactId=handlers -DgroupId=sw.wine</code> 
 +On modifiera ensuite le pom du projet handlers en: 
 +  * supprimant les tag ''<version>'' et ''<groupId>'' dans ''<project>''((mais pas dans ''<parent>'')) 
 +  * et en ajoutant dans ''<parent>'': <code><relativePath>..</relativePath></code> 
 +Enfin on ajoutera les dépendances ''handlers'' <- ''model'', ''services'' <- ''handlers'', ''wine-service'' <- ''handlers''
 + 
 +Déplacer ensuite la classe du handler de log dans le projet ''handlers'' 
 + 
 +Modifier le handler de log pour afficher le nom de l'élément principal du message transmis.
  
 ===== Ajout d'information ===== ===== Ajout d'information =====
  
-Créer un nouveau handler qui récupère dans le header SOAP la valeur de l'élément ''client-id'' et l'injecte dans le contexte (propriété "client-id"). Modifier le handler de log pour afficher cette propriété si elle est présente. Ajouter ce handler dans la chaine d'interception et modifier le test soapUI de votre service de location pour y intégrer le nouveau header et tester.+Créer un nouveau handler qui récupère dans le header SOAP la valeur de l'élément ''client-id'' et l'injecte dans le contexte (propriété "client-id"). Modifier le handler de log pour afficher cette propriété si elle est présente. Ajouter ce handler dans la chaine d'interception et modifier le test soapUI de votre service de livraison pour y intégrer le nouveau header et tester.
  
 ===== Récupération de l'objet client ===== ===== Récupération de l'objet client =====
  
-Créer un handler logique d'authentification qui ajoute une propriété ''client'' contenant un objet ''Client'' correspondant à la propriété ''client-id''. Si le client n'existe pas, le handler interdit l'accès au service. Ajouter l'intercepteur dans la chaine des services et tester. On créera un ensemble de clients pour le test via un test JUnit dans le projet ''services'' en utilisant JPA. +Créer un handler logique d'authentification qui ajoute une propriété ''client'' contenant un objet ''Client'' correspondant à la propriété ''client-id''. Si le client n'existe pas, le handler interdit l'accès au service. Ajouter l'intercepteur dans la chaine des services et tester. On créera un ensemble de clients pour le test via un test JUnit dans le projet ''wine-service'' en utilisant JPA. 
  
 ===== Débit du compte client ===== ===== Débit du compte client =====
  
-Ajouter un champ de type ''javax.xml.ws.WebServiceContext'' dans la classe d'implémentation du service de location.+Ajouter un champ de type ''javax.xml.ws.WebServiceContext'' dans la classe d'implémentation du service de livraison.
 Annoter ce champ avec ''@Resource'' afin que le contexte soit injecté via IoC.  Annoter ce champ avec ''@Resource'' afin que le contexte soit injecté via IoC. 
 La méthode ''getMessageContext()'' permet alors de récupérer le contexte du message et les propriétés qui ont été ajoutées par les handlers.  La méthode ''getMessageContext()'' permet alors de récupérer le contexte du message et les propriétés qui ont été ajoutées par les handlers. 
 Modifier le code métier du service pour, en plus, débiter le compte du client.  Modifier le code métier du service pour, en plus, débiter le compte du client. 
-<note warning>Seules les propriétés dont le scope est MessageContext.Scope.APPLICATION peuvent être accédées dans le bean qui code le service. Il faut donc penser à changer le scope de la propriété ''client'' dans le handler d'authentification via <code java>ctx.setScope("client", Scope.APPLICATION);</code></note> +<note tip>Seules les propriétés dont le scope est MessageContext.Scope.APPLICATION peuvent être accédées dans le bean qui code le service. Il faut donc penser à changer le scope de la propriété ''client'' dans le handler d'authentification via <code java>ctx.setScope("client", Scope.APPLICATION);</code></note>
- +