Java EE7 由一堆“bean”定义组成:
- 托管 Bean 1.0 (JSR-316 / JSR-250)
- Java 1.0 (JSR-330) 的依赖注入
- CDI 1.1 (JSR-346)
- JSF 托管 Bean 2.2 (JSR-344)
- EJB 3.2 (JSR-345)
为了摆脱脑海中的混乱,我研究了几篇“何时使用哪种bean类型”的文章。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 类型实际上支持容器管理的事务?
- 只是为了好奇,如果上面的代码有误,我怎么能用一个简单的演示应用程序来测试它呢?
(顺便说一句:有人在这里描述了类似的问题,但它的解决方案不适用于我的情况。