将Interceptor配置为用于应用程序内的所有CDI-Beans

时间:2010-09-09 08:19:26

标签: java-ee-6 cdi jboss-weld

在我的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:

//CDI bean using Inteceptor
@Named @RequestScoped
@Secure
public class TestBean {
    public String doStuff() {
    }
}

现在我问自己,我是否需要注释所有我的CDI-Bean才能使用这个拦截器?或者有没有办法配置beans.xml来为我的所有CDI bean使用拦截器,而不必为每个bean声明它?

4 个答案:

答案 0 :(得分:2)

我认为你不能。但是,您可以通过使用构造型来节省一些打字:

@Named
@RequestScoped
@Secure
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

然后仅使用@Secure

注释您的bean

答案 1 :(得分:2)

您可以尝试使用我几个月前写过的小型CDI扩展程序:

https://github.com/struberg/InterDyn

这将允许您通过regexp样式动态地将CDI拦截器应用于一堆类。

它很快就会成为Apache MyFaces CODI的一部分,我只需要花些时间来清理配置部分;)

答案 2 :(得分:2)

这些可能会迟到,但我遇到了一个需要全局/应用程序范围拦截器的要求。

要启用应用程序拦截器,请将拦截器注释为:

@Priority(Interceptor.Priority.APPLICATION)
@Interceptor
@Logging
public class MyLoggingInterceptor {}

在这种情况下,好消息是你不必在beans.xml中声明拦截器:

Oracle javaee7 tutorial

答案 3 :(得分:0)

所有豆子都没用。你可以在bootstrapping期间操纵bean - 例如codi-addons中的ultra_lite_ejbs(参见bitbucket org)使用它。也许它是你的灵感来源。恕我直言像openwebbeans.apache.org这样的社区更适合您的CDI相关问题。