在我的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声明它?
答案 0 :(得分:2)
我认为你不能。但是,您可以通过使用构造型来节省一些打字:
@Named
@RequestScoped
@Secure
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {
}
然后仅使用@Secure
答案 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中声明拦截器:
答案 3 :(得分:0)
所有豆子都没用。你可以在bootstrapping期间操纵bean - 例如codi-addons中的ultra_lite_ejbs(参见bitbucket org)使用它。也许它是你的灵感来源。恕我直言像openwebbeans.apache.org这样的社区更适合您的CDI相关问题。