CDI 拦截器作用域注解
CDI interceptor Scope annotation
上下文:
Wildfly 8.1.0
与 CDI 1.2
根据 CDI1.2
的 CDI
规范,如果注释 @Priority(somepriorityvalue)
,则无需在 beans.xml
中声明 cdi
但是,除非我添加 @Dependent
注释
,否则永远不会调用以下 cdi 拦截器
@RequiresLoggedInAccount
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class MyInterceptor {
@AroundInvoke
public Object intercept(final InvocationContext ic) throws Exception {
//intercept something and then...
return ic.proceed();
}
}
和拦截器绑定:
@Inherited
@Documented
@InterceptorBinding
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface RequiresLoggedInAccount {
}
请注意,拦截器绑定和拦截器是在与使用它们的地方不同的 jar 模块中定义的(因此 @Priority 的用途)。
是不是我忽略了什么?为什么我必须为拦截器添加 CDI
的 @Dependent
作用域?
是不是因为我在beans.xml
bean-discovery-mode="annotated"
里面特别说明了
WildFly 8.1 附带 Weld 2。1.x(我忘记了 x,但 2.1 与 CDI 1.1 兼容)。您可以对其应用补丁以升级到符合 CDI 1.2 的 Weld 2.2,这个问题应该会为您解决。
您看到的行为与 CDI 1.1 实施一致。
上下文:
Wildfly 8.1.0
与 CDI 1.2
根据 CDI1.2
的 CDI
规范,如果注释 @Priority(somepriorityvalue)
beans.xml
中声明 cdi
但是,除非我添加 @Dependent
注释
@RequiresLoggedInAccount
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class MyInterceptor {
@AroundInvoke
public Object intercept(final InvocationContext ic) throws Exception {
//intercept something and then...
return ic.proceed();
}
}
和拦截器绑定:
@Inherited
@Documented
@InterceptorBinding
@Target({METHOD, TYPE})
@Retention(RUNTIME)
public @interface RequiresLoggedInAccount {
}
请注意,拦截器绑定和拦截器是在与使用它们的地方不同的 jar 模块中定义的(因此 @Priority 的用途)。
是不是我忽略了什么?为什么我必须为拦截器添加 CDI
的 @Dependent
作用域?
是不是因为我在beans.xml
bean-discovery-mode="annotated"
WildFly 8.1 附带 Weld 2。1.x(我忘记了 x,但 2.1 与 CDI 1.1 兼容)。您可以对其应用补丁以升级到符合 CDI 1.2 的 Weld 2.2,这个问题应该会为您解决。
您看到的行为与 CDI 1.1 实施一致。