2

在我的 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 声明它?

4

4 回答 4

2

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

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

}

然后只用注释你的豆子@Secure

于 2010-09-09T08:25:47.957 回答
2

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

https://github.com/struberg/InterDyn

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

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

于 2011-09-12T20:35:26.533 回答
2

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

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

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

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

Oracle javaee7教程

于 2015-02-02T21:56:33.773 回答
0

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

于 2010-11-28T20:51:15.243 回答