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中使用它,我很好奇这是否只是规范中的一个疏漏。谢谢!
答案 0 :(得分:1)
@TransactionScoped
不是标准范围,以某种方式不能由CDI实现(或者,CDI隐含)。它comes from JTA,也有他们的包裹-javax.transaction
。
话虽如此,它的行为应与所有其他@NormalScope
上下文相同,因此应触发@Initialized
事件供您观察。尽管确实要注意CDI spec only recommends this,但要说:
在初始化自定义上下文时,鼓励使用便携式扩展程序使用限定符@Initialized(X.class)触发事件,在销毁自定义上下文时使用限定符@Destroyed(X.class)触发事件,其中X是与上下文关联的范围类型。应该选择合适的事件有效负载。
我自己还没有尝试过,但是我敢打赌这对于大多数最新的实现都是可行的。再说一次,您使用的是CDI 1.1,它现在已经很古老了。
答案 1 :(得分:0)
是的,因为这不是必需的,并且可能会增加大量开销(可以使用已经提供的请求范围事件避免该开销),所以不会将此开销添加到tomee中。
当您从javax。*开始实现某些未指定的问题时,用户会认为它实际上是错误的,因此会认为它是可移植的,因此最好在可能的恕我直言下遵守该规范。