代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

配置拦截器以用于应用程序内的所有CDI be an

  •  1
  • Wolkenarchitekt  · 技术社区  · 14 年前

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

    要使用它,我会相应地注释CDIBean:

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

    现在我问自己,要使用这个拦截器,是否必须注释所有CDIBeans?或者,有没有一种方法可以配置beans.xml来为所有cdi bean使用拦截器,而不必为每个bean声明拦截器?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Bozho    14 年前

    我觉得你做不到。但是,您可以通过使用原型来节省一些打字时间:

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

    然后只用 @Secure

        2
  •  2
  •   struberg    13 年前

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

    https://github.com/struberg/InterDyn

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

    它将很快成为ApacheMyFacesCodi的一部分,我只需要找点时间先清理配置部分;)

        3
  •  1
  •   maress    9 年前

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

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

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

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

    Oracle javaee7 tutorial

        4
  •  0
  •   Peter    14 年前

    所有的豆子都没用。您可以在引导过程中操作bean——例如,codi插件上的超精简EJB(参见bitback org)使用它。也许这是你的灵感。imho例如openwebbeans.apache.org这样的社区更适合您的CDI相关问题。