IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

EJB 3.0: les interceptors

Ce tutoriel a pour but de présenter une des nouvelles fonctionnalités apportées par la spécification EJB 3.0 :
les interceptors.

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Définition

Un interceptor est une méthode qui intercepte l'appel d'une méthode métier.

Les interceptors fonctionnent à la manière des filtres avec les servlets.

Ils sont automatiquement appelés, juste avant que les méthodes métiers du bean soient appelées.

Ils peuvent être appliqués à des méthodes métiers dans des session beans (stateful et stateless) et dans des message-driven beans.

On peut définir une méthode interceptor dans une classe bean ou dans une classe dédiée.
La signature d'une méthode interceptor est la suivante:

 
TéléchargerCacher/Afficher le codeSélectionnez

Une classe interceptor ou une classe bean ne peut avoir qu'une seule méthode @AroundInvoke.

II. Avantages

  • un contrôle plus fin dans le déroulement d'une méthode.
  • on peut de façon élégante analyser et manipuler des paramètres et autoriser ou interdire l'exécution d'une méthode métier.
  • on arrive ainsi à gérer des fonctionnalités techniques (logging, traçage, sécurité) de façon transparente dans les méthodes métiers.

III. Exemples d'utilisation

  • contrôle des permissions sur des méthodes
  • modification des paramètres avant qu'ils soient passés au bean ( InvocationContext.getParameters() )
  • modifier la valeur retourner par un bean
  • catcher et gérer les exceptions des méthodes
  • totalement interrompre l'appel
  • etc

IV. Le pattern Chain of Responsibility (CoR)

Les interceptors sont une forme du pattern Chain of Responsibility.

Ce pattern concerne une chaîne d'objets qui sont liés à travers des références indirectes pour permettre à un objet de traiter une requête ou la passer à un autre objet dans la chaîne.

C'est ce qui se passe avec les interceptors dans les EJB :

la méthode proceed() provoque l'appel de la prochaine méthode interceptor dans la chaîne.

Quand la dernière méthode interceptor AroundInvoke est appelée, la méthode proceed() appelle la méthode métier du bean.

La flèche ci-dessous illustre les enchaînements dans le cas de plusieurs intercepteurs appliqués à un bean:

 
TéléchargerCacher/Afficher le codeSélectionnez

Image non disponible

V. L'interface InvocationContext

L'interface InvocationContext permet de propager un état à travers une chaîne d'interceptors.

view plainprint?

 
TéléchargerCacher/Afficher le codeSélectionnez

Il faut toujours appeler la méthode proceed() dans l'appel de l'objet invocationContext. Sinon, l'invocation de la méthode ne continue pas.

VI. Exemple

Voici un exemple d'un mini projet qui définit une classe interceptor, ainsi qu'une méthode interceptor à l'intérieur du bean.

Les deux sont appelées mais selon un ordre:

les interceptors sont appelés dans l'ordre dans lequel ils sont spécifiés mais les interceptors définis dans des classes externes sont éxécutées AVANT un interceptor définit dans une classe bean.

Dans cet exemple, elles affichent des traces dans les fichiers logs du serveur d'application, ainsi que dans le fichier de trace log4J.

Si on choisit le serveur d'application JBoss, il faut aller voir dans : {jboss-install-path}\server\default\log\server.log

Image non disponible

La business interface BonjourRemote.java :

 
TéléchargerCacher/Afficher le codeSélectionnez

Avec l'annotation @Interceptors, on indique quelles classes externes vont être utilisées en tant qu'interceptors.

Toutes les méthodes du bean sont interceptées.

L'annotation @AroundInvoke est utilisée pour définir une méthode en tant qu'interceptor.

La classe bean BonjourBean.java :

 
TéléchargerCacher/Afficher le codeSélectionnez

La classe interceptor TraceInterceptor.java :

 
TéléchargerCacher/Afficher le codeSélectionnez

La classe Client.java :

 
TéléchargerCacher/Afficher le codeSélectionnez

Le fichier jndi.properties :

 
TéléchargerCacher/Afficher le codeSélectionnez

Le fichier log4j.properties :

 
TéléchargerCacher/Afficher le codeSélectionnez

En sortie, le fichier sortie.log (spécifique log4J) :

 
TéléchargerCacher/Afficher le codeSélectionnez

En sortie, le fichier server.log (spécifique JBoss) :

 
TéléchargerCacher/Afficher le codeSélectionnez

On voit bien ici que la méthode log(InvocationContext ctx) définit dans la classe interceptor est exécutée avant celle définit dans la classe bean, myBeanInterceptor(InvocationContext ctx).

Cette technique d'interception se rapproche de la programmation par aspect (AOP): le code métier est séparé du code d'interception.

Une méthode interceptor est appelée un advice, et la classe contenant un advice est appelée un aspect.

On peut également appliquer une méthode interceptor à une seule méthode d'un bean, en annotant cette dernière :

 
TéléchargerCacher/Afficher le codeSélectionnez

On peut également définir les interceptors de façon déclarative dans le fichier de déploiement ejb-jar.xml :

 
TéléchargerCacher/Afficher le codeSélectionnez

VII. Liens

VIII. Remerciements

Je tiens à remercier Ricky81, OButterlin pour les conseils, remarques et relectures, ainsi que RideKick pour la correction orthographique.

Je remercie aussi www.developpez.com me permettant de publier cet article et Nono40 pour ses outils.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright © 2007 Celinio FERNANDES. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.