2015-10-22 2 views
5

は私が迎撃と注釈が共通-utilsのと呼ばれるモジュールである InterceptorBindingは

@Traceable 
@Interceptor 
public class EnterExitLogger { 
    @AroundInvoke 
    public Object aroundInvoke(InvocatiobContext c) {} 
} 

下のような迎撃を書いた
@InterceptorBinding 
@Retention(RUNTIME) 
@Target(TYPE, METHOD) 
public @interface Traceable {} 

の下のようなカスタムアノテーションを作成動作しません。

ターゲットクラスが含まれている

<interceptors> 
    <class>my.package.EnterExitLogger</class> 
</interceptors> 

以下のように私は私のbeans.xmlファイルでインターセプタエントリを宣言し

@Traceable 
public class CDIManagedBean { 
} 

以下のように私はクラスレベルで@Traceableと私のターゲットクラスを注釈付き別のモジュール。 beans.xmlは、ターゲットクラスのモジュールのMETA-INFディレクトリにあります。

ターゲットクラスのメソッドは、レストクラスから呼び出されます。メソッドを呼び出すと、インターセプタのAroundInvokeメソッドは呼び出されません。

私はドキュメントを読んで、インターセプタにパブリック引数なしコンストラクタが含まれるべきであることを理解しました。私はそれを加えた。しかし、依然としてインターセプタは呼び出されていませんでした。

ドキュメントを読んだ後にカスタムアノテーションに@Inheritedを追加しました。しかし、依然としてインターセプタは呼び出されていませんでした。

ドキュメントから、私はSerializableインターフェイスを実装しているインターセプタに気付きました。私はSerializableを実装していません。まだ動作しませんでした。

次に、インターセプタ、beans.xmlファイル、およびターゲットクラスからカスタムアノテーションを削除しました。私はまた、インターセプタから引数なしコンストラクタを削除し、Serializableを削除しました。

次に、ターゲットクラスに@Interceptors(EnterExitLogger.class)という注釈を付け、フローを呼び出しました。私の迎撃隊が呼ばれました。

InterceptorBindingを使用してどのようにすればいいですか?

P.S.

私はWAS 8.5サーバーに耳を配置しています。

答えて

1

インターセプタが保存されているモジュールに空のbeans.xmlファイルを追加した後に問題が修正されました。 beans.xmlファイルは、私がcdi injectionを使いたいときにだけ必要です。

5

Java EE Tutorialがいいの説明とインターセプタについてのいくつかの例を提供します。

@Inherited@InterceptorBindingで注釈されなければならないインターセプタバインディングアノテーションのを作成します。

@Inherited 
@InterceptorBinding 
@Retention(RUNTIME) 
@Target({METHOD, TYPE}) 
public @interface Logged { } 

はincerceptorクラスを作成します。上に作成されたインターセプタバインディングアノテーションと@Interceptor注釈でアノテートされます。

すべて@AroundInvokeメソッドはInvocationContext引数をとり、Objectを返し、Exceptionをスローします。@AroundInvoke方法は、ターゲットクラスのメソッドが呼び出されますInvocationContext#proceed()方法、呼び出す必要があります:インターセプターと結合型が定義されたら

@Logged 
@Interceptor 
public class LoggedInterceptor implements Serializable { 

    public LoggedInterceptor() { 

    } 

    @AroundInvoke 
    public Object logMethodEntry(InvocationContext invocationContext) throws Exception { 

     System.out.println("Entering method: " 
       + invocationContext.getMethod().getName() + " in class " 
       + invocationContext.getMethod().getDeclaringClass().getName()); 

     return invocationContext.proceed(); 
    } 
} 

、あなたがいることを指定するには、バインディングタイプで豆や個々のメソッドに注釈を付けることができますインターセプタは、Beanのすべてのメソッドまたは特定のメソッドのいずれかで呼び出されます。

例えば、PaymentHandler Beanがそのビジネスメソッドのいずれかの呼び出しは、インターセプタの@AroundInvokeメソッドが呼び出されることになりますことを意味し、@Logged注釈されている:

@Logged 
@SessionScoped 
public class PaymentHandler implements Serializable {...} 

あなたは方法のセットのみを傍受することができますしかし、唯一の所望の方法注釈によって豆:CDIアプリケーションで呼び出されるインターセプタためには

@Logged 
public String pay() {...} 

@Logged 
public void reset() {...} 

、それはで指定する必要があります210ファイル:アプリケーションが複数のインターセプターを使用している場合

<interceptors> 
    <class>your.package.LoggedInterceptor</class> 
</interceptors> 

、インターセプタはbeans.xmlファイルで指定された順序で呼び出されます。

+1

私は残念ながらbeans.xmlを追加して、タグを宣言する必要がありました(Java EE 7でも)!ありがとう。 –