6

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 のスコープを拡張できるかどうか誰かが知っていますか?

4

2 に答える 2

3

これは、インターセプターが @ManagedBean にアクセスできないために発生します。@ViewScope は CDI の一部ではなく、JSF Bean に付属しています。

それを機能させるための最も確実な方法は、それを提供する拡張機能の 1 つを使用して、CDI で @ViewScoped を使用することです。オプションには、MyFaces CODI と Seam 3 (たとえば) が含まれます。

MyFaces CODIをインストールし、これらのインポートで次の注釈を使用することにより、(あなたが説明したのと同じ方法で)動作させました:

import javax.faces.bean.ViewScoped;
import javax.inject.Named;

@Named
@ViewScoped
@Interceptors({ MyInterceptor.class})
于 2012-10-23T16:32:29.867 に答える
0

または、この素敵なトピックhttp://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/を試すことができるかもしれませんSteven Verborgh。CDI 拡張機能を使用して作成する方法を説明しています。独自の ViewScope。

于 2013-04-29T17:24:47.483 に答える