L'applicazione Java EE 6 è composta da un modulo war e ejb contenuto in un file ear. Sto usando CDI per DI (ad esempio, ho un file beans.xml in entrambi i moduli). Voglio usare un intercettore di logging che è definito anche nel modulo ejb nel modulo war. Ho permesso l'intercettore in beans.xml del bean:CDI: utilizzo di Interceptor su diversi moduli/archivi bean
<beans>
<interceptors>
<class>com.test.interceptor.LoggingInterceptor</class>
</interceptors>
</beans>
Questo funziona solo per le classi che sono annotati con l'intercettore nel modulo EJB . Le classi nel modulo war non vengono intercettate (sebbene siano annotate anche con l'intercettatore). Pensavo che la soluzione sarebbe stata quella di abilitare l'intercettore nell'intercettore della guerra, come pure (come sopra). Ma l'applicazione non può essere distribuito con il seguente messaggio:
GRAVI: eccezione durante il caricamento dell'app: WELD-Enabled 001.417 com.test.interceptor.LoggingInterceptor intercettore classe di classe non è né @Interceptor annotato né registrate attraverso un'estensione portatile
mio LoggingInterceptor si presenta così:
@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)});
}
}
}
E vincolante l'intercettore:
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Log {}
Come posso utilizzare l'intercettore per entrambi i moduli?
Hai trovato la soluzione a questo problema? Sarebbe interessante vederlo. – mik
@milk no, non l'ho fatto. Ho consolidato tutti i moduli in un modulo war, cosa possibile a partire da Java EE 6. – Theo
wow, grazie per averlo esposto così chiaramente. Stavo avendo lo stesso identico problema e il consolidamento di tutto questo in un modulo lo ha risolto. A volte J2EE cerca di rendere le cose difficili su ya ... – JoshC13