CDI 拦截器作用域注解

CDI interceptor Scope annotation

上下文:

Wildfly 8.1.0CDI 1.2

根据 CDI1.2CDI 规范,如果注释 @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.xmlbean-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 实施一致。