【问题标题】:CDI 1.1: Is @Observes @Initialized(TransactionScoped.class) supposed to work?CDI 1.1:@Observes @Initialized(TransactionScoped.class) 应该工作吗?
【发布时间】:2018-08-28 21:16:46
【问题描述】:

CDI 1.1:@Observes @Initialized(TransactionScoped.class) 应该工作吗?

@ApplicationScoped
public class MyClass {
public void processConversationScopedInit(@Observes 
  @Initialized(TransactionScoped.class) Object payload) {}

  public void processConversationScopedDestroyed(@Observes 
  @Destroyed(TransactionScoped.class) Object payload) {}
}

这是 CDI 1.1 中的标准范围,但这里的列表中明显缺少它:

http://www.next-presso.com/2014/06/you-think-you-know-everything-about-cdi-events-think-again/

我似乎无法让它在 TomEE 7.0.5/OpenWebBeans 中运行,我很好奇这是否只是规范中的疏忽。谢谢!

【问题讨论】:

    标签: java cdi weld apache-tomee openwebbeans


    【解决方案1】:

    @TransactionScoped 不是标准范围,它不是由 CDI(或者,CDI impls)实现的。它是comes from JTA,它也有他们的包 - javax.transaction

    话虽如此,它的行为应该与所有其他 @NormalScope 上下文一样,因此应该触发 @Initialized 事件供您观察。虽然请注意CDI spec only recommends this 说:

    鼓励可移植扩展在自定义上下文初始化时触发带有限定符 @Initialized(X.class) 的事件,并在自定义上下文被销毁时触发带有限定符 @Destroyed(X.class) 的事件,其中 X 是与上下文关联的范围类型。应选择合适的事件负载。

    我自己没有尝试过,但我敢打赌这适用于大多数最新的实现。话又说回来,您现在处于相当古老的 CDI 1.1 中。

    【讨论】:

      【解决方案2】:

      是的,因为它不是必需的,并且可能会增加显着的开销,使用已经提供的请求范围事件可以避免这种开销,因此它没有添加到 tomee。

      当您开始从 javax.* 实现某些未规范的东西时的问题是,当它实际上是错误的时,用户会认为它是可移植的,因此最好尽可能尊重规范恕我直言。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        • 2013-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多