我的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