Depuis J2EE5 et la spécification EJB (JSR-318), l’annotation @javax.ejb.EJB
permet d’injecter une instance d’un EJB dans une variable.
Grâce à J2EE6 et la spécification Dependency Injection (JSR-330), l’annotation @javax.inject.Inject
permet d’injecter n’importe quelle sorte de POJO (Plain Old Java Object) dont, bien entendu, des EJB dans une variable. Quelle annotation utiliser ?
Dans la plupart des cas, il est préférable d’utiliser l’annotation @javax.inject.Inject
au lieu de @javax.ejb.EJB
car elle est globale à toutes les sortes d’objets. Il faudra impérativement utiliser @javax.ejb.EJB
lorsque :
- Le conteneur où est déployée l’application n’est pas compatible avec CDI
- L’EJB à injecter est un EJB remote
Comme indiqué dans la documentation de référence de Weld, si l’on souhaite utiliser l’annotation @javax.inject.Inject
pour injecter un EJB remote, il est nécessaire de passer par un autre objet référenceant l’EJB remote via l’annotation @javax.ejb.EJB
:
@Produces @EJB(ejbLink="../their.jar#PaymentService")
PaymentService paymentService;
Pour plus d’information, lire la documentation de Weld ou ce message intéressant sur le forum JBoss : https://community.jboss.org/thread/179388?start=15&tstart=0,
Les intercepteurs sont des petits programmes qui interviennent avant et après l’exécution d’une méthode. ils permettent de faire de la programmation orientée AOP sur les méthodes publics des EJB. Il est possible de s’en servir pour logger les entrées et sorties d’une méthode comme je le propose dans mon exemple qui se base sur un simple “HelloWorld” en EJB3. J’utilise openEJB pour simplifier l’exécution et vous permettre d’utiliser l’exemple tel quel.
Création de l’intercepteur : c’est un EJB standard avec une méthode public annotée avec @AroundInvoke.
public @Stateless class LoggerServiceBean implements LoggerService {
@AroundInvoke
public Object c(InvocationContext ctx) throws Exception {
// Affiche le nom de la méthode
System.out.println(ctx.getMethod().toGenericString());
// Liste les paramètres passés à la méthode
for (int i = 0; i < ctx.getParameters().length; i++) {
if (i != 0) {
System.out.print(",");
}
System.out.print("parameter " + i +" : " + ctx.getParameters()[i]);
}
System.out.println();
return ctx.proceed(); //Exécute de la méthode
}
}
Comme vous pouvez le voir, c’est l’objet InvocationContext qui va vous permettre de visualiser la méthode et les paramètres utilisés.
Déclaration de l’EJB en tant qu’intercepteur : ajouter ces quelques lignes dans le fichier META-INF/ejb-jar.xml :
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0">
<interceptors>
<interceptor>
<interceptor-class>org.everythingiswrong.tutorial.interceptor_openejb.interceptor.LoggerServiceBean</interceptor-class>
</interceptor>
</interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>*</ejb-name>
<interceptor-class>org.everythingiswrong.tutorial.interceptor_openejb.interceptor.LoggerServiceBean</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
Voici l’adresse SVN du projet : https://subversion.assembla.com/svn/everythingiswrong/tutorial-interceptor-openejb