我的Java EE 6应用程序由打包在ear文件中的war和ejb模块组成。我使用CDI进行DI(即,我在两个模块中都有一个beans.xml文件)。我想使用war模块中ejb模块中定义的日志拦截器。我已经启用拦截器在EJB的beans.xml中:CDI:跨不同模块/ bean档案使用拦截器
<beans>
<interceptors>
<class>com.test.interceptor.LoggingInterceptor</class>
</interceptors>
</beans>
这对于被注释与EJB模块在拦截器类唯一的工作。战争模块中的类不会被拦截(虽然它们也使用拦截器进行注释)。我认为解决方案应该是在战争拦截器中启用拦截器(如上所述)。
严重:但是,应用程序不能与下面的消息被部署异常而加载的应用程序:WELD-001417启用拦截器类类com.test.interceptor.LoggingInterceptor既不是通过便携式扩展注释@Interceptor也不登记
我LoggingInterceptor看起来是这样的:
@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)});
}
}
}
而且拦截器绑定:
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Log {}
如何为两个模块使用拦截器?
您是否找到解决此问题的解决方案?看到它会很有趣。 – mik 2012-05-28 07:28:19
@milk不,我没有。我将所有模块合并到一个war模块中,这是自Java EE 6. – Theo 2012-05-29 10:17:56
哇,这是可能的,谢谢你清楚地阐明了这一点。我遇到了完全相同的问题,并将它整合到一个模块中解决了它。有时候J2EE只是试图让事情变得艰难...... – JoshC13 2015-11-06 02:59:17