【问题标题】:Configure Interceptor to be used for ALL CDI-Beans inside an application配置拦截器以用于应用程序内的所有 CDI-Bean
【发布时间】:2010-09-09 08:19:26
【问题描述】:

在我的 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-Bean 才能使用这个拦截器?或者有没有办法配置 beans.xml 为我所有的 CDI bean 使用拦截器,而不必为每个 bean 声明它?

【问题讨论】:

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


    【解决方案1】:

    我不认为你可以。但是,您可以通过使用刻板印象来节省一些打字时间:

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

    然后只用@Secure注释你的bean

    【讨论】:

      【解决方案2】:

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

      https://github.com/struberg/InterDyn

      这将允许您通过正则表达式样式将 CDI 拦截器动态应用到一堆类。

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        Oracle javaee7 tutorial

        【讨论】:

          【解决方案4】:

          不是所有的豆子都有用。您可以在引导期间操作 bean - 例如codi-addons 的 ultra_lite_ejbs(参见 bitbucket org)使用它。也许这对你有启发。恕我直言,例如像 openwebbeans.apache.org 这样的社区会更适合您的 CDI 相关问题。

          【讨论】:

            猜你喜欢
            • 2015-09-03
            • 2014-12-31
            • 2020-06-17
            • 2014-03-10
            • 2021-04-01
            • 2011-05-02
            • 2015-01-31
            • 1970-01-01
            • 2014-09-10
            相关资源
            最近更新 更多