アプリケーション内のすべてのCDI-Beanに使用するインターセプターを構成する
-
01-10-2019 - |
質問
私のJEE6-CDI-WEBAPPでは、このようなセキュリティインターセプターを宣言しました。
//Secure.java
@Inherited
@Target({TYPE, METHOD})
@Retention(RUNTIME)
@InterceptorBinding
public @interface Secure
{}
//SecurityInterceptor.java
@Secure
@Interceptor
public class SecurityInterceptor
{
@AroundInvoke
protected Object invoke(InvocationContext ctx) throws Exception
{
// do stuff
ctx.proceed();
}
}
beans.xml内でそれを宣言しました:
//beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives/>
<decorators/>
<interceptors>
<class>com.profitbricks.security.SecurityInterceptor</class>
</interceptors>
</beans>
それを使用するには、それに応じてCDI-Beanに注釈を付けます。
//CDI bean using Inteceptor
@Named @RequestScoped
@Secure
public class TestBean {
public String doStuff() {
}
}
今、私は自分自身に尋ねます、私はこのインターセプターを使用するために私のすべてのCDI-Beansに注釈を付けなければなりませんか?または、すべてのBeanで宣言することなく、すべてのCDI-Beanにインターセプターを使用するようにBeans.xmlを構成する方法はありますか?
解決
できないと思います。ただし、ステレオタイプを使用して、少し入力することができます。
@Named
@RequestScoped
@Secure
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {
}
そして、あなたの豆にのみ注釈を付けます @Secure
他のヒント
私が数ヶ月前に書いた小さなCDI拡張機能を使用しようとすることができます:
https://github.com/struberg/interdyn
これにより、regexpスタイルを介してCDIインターセプターを多数のクラスに動的に適用できます。
まもなくApache Myfaces Codiの一部になります。最初に構成部分をクリーンアップする時間を見つける必要があります;)
これらは遅れている可能性がありますが、グローバル/アプリケーションワイドインターセプターが必要な要件に遭遇しました。
アプリケーションインターセプターを有効にするには、インターセプターに次のように注釈を付けます。
@Priority(Interceptor.Priority.APPLICATION)
@Interceptor
@Logging
public class MyLoggingInterceptor {}
この場合、良いニュースは、Beans.xmlのインターセプターを宣言する必要がないことです。
すべての豆は役に立ちません。ブートストラップ中に豆を操作できます-CODI -ADDONS(Bitbucket orgを参照)でultra_lite_ejbsなどを使用できます。多分それはあなたにとってインスピレーションです。 IMHO Eたとえば、OpenWebeans.apache.orgのようなコミュニティは、CDI関連の質問に適しています。