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

CDI 1.1: Is @Observes @Initialized(TransactionScoped.class) supposed to work?

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 中工作,我很好奇这是否只是规范中的疏忽。谢谢!

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

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

Portable extensions are encouraged to fire an event with qualifier @Initialized(X.class) when a custom context is initialized, and an event with qualifier @Destroyed(X.class) when a custom context is destroyed, where X is the scope type associated with the context. A suitable event payload should be chosen.

我自己还没有尝试过,但我敢打赌这适用于大多数最新的实现。再一次,你在 CDI 1.1 中,现在已经很古老了。

是的,因为它不是必需的,并且可能会增加大量开销,使用已经提供的请求范围事件可以避免,因此未将其添加到 tomee。

当你开始从 javax.* 实现一些没有规范的东西时的问题是用户会认为它是可移植的,但实际上是错误的,所以最好尽可能尊重规范恕我直言。