私の Java EE 6 アプリケーションは、ear ファイルにパッケージ化された war と ejb モジュールで構成されています。DI に CDI を使用しています (つまり、両方のモジュールに beans.xml ファイルがあります)。war モジュールの ejb モジュールで定義されているロギング インターセプタも使用したいと考えています。ejb の beans.xml でインターセプターを有効にしました。
<beans>
<interceptors>
<class>com.test.interceptor.LoggingInterceptor</class>
</interceptors>
</beans>
これは、 ejb モジュールのインターセプタで注釈が付けられたクラスに対してのみ機能します。war モジュールのクラスはインターセプトされません (ただし、インターセプターのアノテーションも付けられます)。解決策は、戦争のインターセプターでもインターセプターを有効にすることだと思いました(上記のように)。ただし、次のメッセージが表示されてアプリケーションをデプロイできません。
SEVERE: アプリのロード中に例外が発生しました: 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 {}
両方のモジュールにインターセプターを使用するにはどうすればよいですか?