JEE7:EJB 和 CDI Bean 是否支持容器管理的事务?
Java EE7由一堆“bean”定义组成:
- 管理式 Bean 1.0 (JSR-316 / JSR-250)
- 依赖注入 Java 1.0 (JSR-330)
- CDI 1.1 (JSR-346)
- JSF 管理豆 2.2 (JSR-344)
- EJB 3.2 (JSR-345)
为了摆脱脑海中的混乱,我研究了几篇关于“何时使用哪种豆类型”的文章。EJB 的优点之一似乎是它们单独支持声明式容器管理的事务(著名的事务注释)。不过,我不确定这是否正确。任何人都可以批准吗?
同时,我想出了一个简单的演示应用程序来检查这是否属实。我刚刚定义了一个CDI bean(不是EJB - 它没有类级注释),如下所示,基于这个片段:
public class CdiBean {
@Resource
TransactionSynchronizationRegistry tsr;
@Transactional(Transactional.TxType.REQUIRED)
public boolean isTransactional() {
return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
}
}
现在,GlassFish 4.0的结果是,此方法实际上返回 true,根据我的查询,此方法未按预期工作。我确实希望容器忽略CDI bean方法上的@Transactional注释,甚至引发异常。我使用新安装的GlassFish 4服务器,因此没有干扰。
所以我的问题真的是:
- 哪些 Bean 类型实际上支持容器管理的事务?
- 只是为了好奇,如果上面的代码是错误的,我怎么能用一个简单的演示应用程序来测试它呢?
(顺便说一句:有人在这里描述了类似的问题,但它的解决方案不适用于我的情况。