7.11. Seam インターセプタ


EJB3 ではセッション Bean コンポーネントに標準的なインターセプタモデルが導入されました。 Bean にインターセプタを追加するには、 @AroundInvoke というアノテーションが付加されたメソッドを持つクラスを記述して、 その Bean にインターセプタのクラス名を指定する @Interceptors のアノテーションを付ける必要があります。 たとえば、 次のインターセプタはアクションリスナーメソッドの呼び出しを許可する前にユーザーがログインされたかを確認します。
public class LoggedInInterceptor { 
    @AroundInvoke 
    public Object checkLoggedIn(InvocationContext invocation) 
        throws Exception { 
        boolean isLoggedIn = Contexts.getSessionContext()
            .get("loggedIn")!=null; 
        if (isLoggedIn) { 
            //the user is already logged in return invocation.proceed(); 
        } else { 
            //the user is not logged in, fwd to login page return "login"; 
        } 
    } 
}
Copy to Clipboard Toggle word wrap
このインターセプタをアクションリスナーとして動作するセッション Bean に適用するには、 そのセッション Bean @Interceptors(LoggedInInterceptor.class) というアノテーションを付加しなければなりません。 ただし、 Seam はクラスレベルのインターセプタ (@Target(TYPE) アノテーションが付与されたもの) 用にメタアノテーションとして @Interceptors を使えるようにすることで、EJB3 でのインターセプタフレームワーク上に構築されます。 以下の例では、 @LoggedIn アノテーションを生成します。
@Target(TYPE) 
@Retention(RUNTIME) 
@Interceptors(LoggedInInterceptor.class) 
    public @interface LoggedIn {}
Copy to Clipboard Toggle word wrap
これでアクションリスナー Bean に @LoggedIn アノテーションを付与しインターセプタを適用することができます。
@Stateless 
@Name("changePasswordAction") 
@LoggedIn 
@Interceptors(SeamInterceptor.class) 
public class ChangePasswordAction implements ChangePassword { 
    ... 
        public String changePassword() { 
            ... 
        } 
}
Copy to Clipboard Toggle word wrap
インターセプタの順番が重要な場合、インターセプタクラスに @Interceptor アノテーションを追加してインターセプタの特定の順序を指定します。
@Interceptor(around={BijectionInterceptor.class, 
                     ValidationInterceptor.class, 
                     ConversationInterceptor.class}, 
    within=RemoveInterceptor.class) 
public class LoggedInInterceptor { 
    ... 
}
Copy to Clipboard Toggle word wrap
組み込み EJB3 の機能に対してクライアント側インターセプタを持たせることもできます。
@Interceptor(type=CLIENT) 
public class LoggedInInterceptor { 
    ... 
}
Copy to Clipboard Toggle word wrap
EJB インターセプタはステートフルとなるため、 そのライフサイクルはインターセプトするコンポーネントのそれと一致します。 状態を維持する必要がないインターセプタの場合、 Seam によりパフォーマンスの最適化が実現し、@Interceptor(stateless=true) が指定されます。
Seam の多くの機能は、前の例で登場したようなインターセプタを含み、組み込みの Seam インターセプタ郡の 1 セットとして実装されます。 これらのインターセプタはインターセプト可能なすべての Seam コンポーネントに対し存在しているため、アノテーションを使って明示的にインターセプタを指定する必要はありません。
Seam のインターセプタは JavaBean コンポーネントと併用することもできます。
EJB はインターセプタを (@AroundInvoke を使った) ビジネスメソッドだけでなく、ライフサイクルメソッドの @PostConstruct@PreDestroy@PrePassivate そして @PostActive に対しても定義します。Seam はコンポーネントおよびインターセプタの両方でこれらのライフサイクルのメソッドを EJB3 Bean のみならず JavaBean コンポーネントに対してもサポートします (JavaBean コンポーネントにとって意味のない @PreDestroy は除きます)。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat