CDI: Utilisation d'intercepteurs dans différents modules / archives de bean
Mon application Java EE 6 est constitué d'une guerre et d'un module ejb emballé dans un fichier ear. Je suis en CDI pour l'ai (c'est à dire que j'ai un beans.xml fichier dans les deux modules). Je veux utiliser un enregistrement à l'intercepteur qui est défini dans le module ejb dans la guerre du module, ainsi. J'ai activé l'intercepteur dans les ejb beans.xml:
<beans>
<interceptors>
<class>com.test.interceptor.LoggingInterceptor</class>
</interceptors>
</beans>
Cela fonctionne uniquement pour les classes annotées avec l'intercepteur dans le module ejb. Les Classes dans la guerre du module ne sont pas interceptés (même s'ils sont annotés avec l'intercepteur trop). J'ai pensé que la solution serait de permettre à l'intercepteur dans la guerre de l'intercepteur, ainsi (comme ci-dessus). Mais l'application ne peut pas être déployé avec le message suivant:
SÉVÈRE: Exception lors du chargement de l'application : SOUDURE-001417 Activé intercepteur de classe de la classe com.test.l'intercepteur.LoggingInterceptor est ni annoté @Interceptor, ni enregistré par le biais d'un portable extension
Mon LoggingInterceptor ressemble à ceci:
@Log
@Interceptor
public class LoggingInterceptor {
private static final Logger logger = Logger.getLogger(LoggingInterceptor.class.getName());
static {
logger.setLevel(Level.ALL);
}
@AroundInvoke
public Object logMethod(InvocationContext ctx) throws Exception {
logger.log(Level.FINE, "ENTRY {0} {1}",
new Object[]{ ctx.getTarget().getClass().getName(), ctx.getMethod().getName() });
long startTime = System.nanoTime();
try {
return ctx.proceed();
} finally {
long diffTime = System.nanoTime() - startTime;
logger.log(Level.FINE, "RETURN {0} {1}",
new Object[]{ ctx.getTarget().getClass().getName(), ctx.getMethod().getName() });
logger.log(Level.FINE, "{0} took {1} ms", new Object[]{ ctx.getMethod(),
TimeUnit.MILLISECONDS.convert(diffTime, TimeUnit.NANOSECONDS)});
}
}
}
Et de l'intercepteur de liaison:
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Log {}
Comment puis-je utiliser de l'intercepteur pour les deux modules?
source d'informationauteur Theo
Vous devez vous connecter pour publier un commentaire.
J2EE 7 spécification (référence):
Cette solution a l'avantage d'être indépendant du constructeur.
Un Exemple:
Il est trop tard, mais si quelqu'un toujours à avoir ce problème.
Les deux modules doivent être chargés par le même chargeur de classe afin de rendre l'usage de l'intercepteur à travers les différents modules du possible, au moins dans WebSphere 8b2.
Dans WebSphere ce paramètre peut être sélectionné dans la console d'administration: Applications > les Types d'Application > WebSphere enterprise applications > [votre nom de l'application] > Classe de chargement et de mise à jour de la détection de > la GUERRE du chargeur de classe politique = Seul le chargeur de classes pour l'application.
L'intercepteur doit être activé qu'une seule FOIS dans beans.xml.
Je me demande si votre GUERRE manque de chargeur de classe visbility dans votre ejb-jar? Je pense que dans l'idéal, le 299 intercepteurs serait dans leur propre pot, visible à la fois de l'EJB et web modules et a permis à la fois de leurs beans.xml.
J'ai le même problème sur JBoss as 6.0 /6.1 (nightly build) et il fixe par la désactivation de séparer les chargeurs de classe (option 1), mais être très prudent avec cela. La séparation des chargeurs de classes n'a pas été introduit pour aucune raison, donc, apparemment, il y a de nouveaux problèmes sur la route...
Cette est le jira rapport, s'il vous plaît voter 🙂
J'ai eu exactement le même problème avec mon journalisation de l'intercepteur sur JBoss 7 et fixée par superposant complète de l'intercepteur du pot dans l'application.
Vous aurez encore à activer l'intercepteur de l'application
breans.xml
.Pas très agréable, mais il fonctionne. Dans Java EE 7, il fonctionne sans l'activation par l'annotation de l'intercepteur
@Priority
.