JBoss 7.1 を使用して Java EE アプリケーションを構築しています。
ユーザー アクションの完全な監査を取得するために、インターセプターを使用して、Bean のメソッドのすべての呼び出しをログに記録する予定です。
そうするために、私は次の入札をしています:
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Logged {
}
次に、インターセプター クラスを定義します。
@Logged
@Interceptor
public class UserActionInterceptor implements Serializable {
private static final long serialVersionUID = 1L;
private Logger log = LoggerFactory.getLogger(UserActionInterceptor.class);
public UserActionInterceptor() {
}
@AroundInvoke
public Object logMethodEntry(InvocationContext invocationContext) throws Exception {
log.debug(invocationContext.getMethod().getName() + " invoked.");
return invocationContext.proceed();
}
}
これまでのところ、これはうまく機能しています。この Interceptor を使用してクラスをバインドすると、ログが取得されます。ただし、Bean クラスをターゲットにしたい場合は、より複雑になります。
タイプ @RequestScoped の Bean があり、それをインターセプターにバインドすると機能します。ただし、 @ViewScoped タイプの Bean がある場合はそうではありません。
@ViewScoped の定義を調べたところ、次のことがわかりました。
@Retention(value=RUNTIME)
@Target(value=TYPE)
@Inherited
public @interface ViewScoped
問題は、このアノテーションにターゲット タイプ METHOD がなく、インターセプターがクラス メソッドの呼び出しをインターセプトできないことにあると感じています。
誰かが以前に同じ問題を抱えていましたか? @ViewScoped の性質を変更せずにメソッドを傍受できるように、Bean のスコープを拡張できるかどうか誰かが知っていますか?