2010-09-09 86 views
1

在我JEE6-CDI-web应用程序里面,我宣布一个安全拦截器,像这样的:配置拦截器被用于所有CDI-豆类应用

//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-Beans都使用这个拦截器?或者是否有一种方法可以将beans.xml配置为对所有CDI bean使用拦截器,而无需为每个单独的bean声明它?

回答

2

我不认为你可以。但是,您可以通过使用定型饶了一下打字:

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

} 

然后只@Secure

0

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

2

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

https://github.com/struberg/InterDyn

这将允许你动态地应用CDI拦截器通过正则表达式的风格一堆类。

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

1

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

要启用应用程序拦截,标注拦截为:

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

在这种情况下,好消息是,你没有申报在beans.xml中拦截:

Oracle javaee7 tutorial

+0

这只适用于EE7,但不失良好的提示 – 2015-08-07 15:31:04