【问题标题】:CDI interceptor Scope annotationCDI拦截器Scope注解
【发布时间】:2015-04-22 18:21:36
【问题描述】:

上下文:

Wildfly 8.1.0CDI 1.2

根据CDI1.2CDI规范,如果beans.xml注解为@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。您是否手动升级到 Weld 2.2?
  • @JohnAment 哦,该死的。它确实随 CDI 1.1 一起提供,这能解释这种行为吗?
  • 这是否也能解释为什么用两个不同的 InterceptorBindings 注释单个拦截器会使拦截器无法加载?
  • 我不确定规范是否支持多个拦截器绑定。是的,如果您没有手动升级,那将解释您所看到的。 bean 定义注释列表在 1.2 中扩展。

标签: java jakarta-ee cdi java-7


【解决方案1】:

WildFly 8.1 附带 Weld 2.1.x(我忘记了 x,但 2.1 符合 CDI 1.1)。您可以对其应用补丁以升级到符合 CDI 1.2 的 Weld 2.2,此问题应该会为您解决。

您看到的行为与 CDI 1.1 实现一致。

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 2014-03-10
    • 2018-09-26
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2015-02-03
    • 2011-07-03
    相关资源
    最近更新 更多