1

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

4

2 回答 2

2

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

话虽如此,它应该像所有其他@NormalScope上下文一样运行,因此应该触发@Initialized事件供您观察。尽管请注意CDI 规范仅通过以下方式推荐此内容:

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

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

于 2018-08-29T07:47:08.217 回答
0

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

当您开始从 javax.* 实现未指定的某些内容时,问题是用户会认为它是可移植的,但实际上它是错误的,因此最好在可能的情况下尊重规范恕我直言。

于 2018-09-17T22:43:51.920 回答