Mi aplicación Java EE 6 consiste en un módulo war y un módulo ejb empaquetados en el archivo ear. Estoy usando CDI para DI (es decir, tengo un archivo beans.xml en ambos módulos). También quiero usar un interceptor de registro definido en el módulo ejb en el módulo war. He activado el interceptor en beans.xml del EJB:CDI: Uso de interceptores en diferentes módulos/archivos de frijoles
<beans>
<interceptors>
<class>com.test.interceptor.LoggingInterceptor</class>
</interceptors>
</beans>
Esto está trabajando sólo para las clases que están anotados con el interceptor en el módulo EJB . Las clases en el módulo de guerra no son interceptadas (aunque están anotadas con el interceptor también). Pensé que la solución sería habilitar el interceptor en el interceptor de la guerra también (como arriba). Pero la aplicación no se puede implementar con el siguiente mensaje:
GRAVES: Excepción durante la carga de la aplicación: Weld-001417 Habilitado com.test.interceptor.LoggingInterceptor clase clase de interceptor no es ni anotado @Interceptor ni registrado a través de una extensión portátil
Mi LoggingInterceptor se ve así:
@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)});
}
}
}
Y la unión del interceptor:
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Log {}
¿Cómo puedo usar el interceptor para ambos módulos?
¿Has encontrado la solución a este problema? Sería interesante verlo. – mik
@milk no, no lo he hecho. Consolidé todos los módulos en un módulo de guerra, lo cual es posible desde Java EE 6. – Theo
wow, gracias por explicarlo tan claramente. Estaba teniendo exactamente el mismo problema y la consolidación de todo en un solo módulo lo resolvió. A veces, J2EE solo trata de complicar las cosas en ti ... – JoshC13