相关疑难解决方法(0)

JEE7:EJB和CDI bean是否支持容器管理的事务?

Java EE7由一堆"bean"定义组成:

  • Managed Beans 1.0(JSR-316/JSR-250)
  • Java 1.0的依赖注入(JSR-330)
  • CDI 1.1(JSR-346)
  • JSF Managed Beans 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,GlassFish 4.0的结果是这个方法实际上返回true,根据我的询问,它没有按预期工作.我确实希望容器忽略CDI bean方法上的@Transactional注释,或者甚至抛出异常.我使用新安装的GlassFish 4服务器,因此没有干扰.

所以我的问题是:

  • 哪些bean类型实际上支持容器管理的事务?
  • 只是为了好奇,如果上面的代码错误,我怎么能用一个简单的演示应用程序来测试呢?

(顺便说一句:有人在这里描述了类似的问题,但其解决方案并不适用于我的情况.

java ejb jta java-ee cdi

19
推荐指数
2
解决办法
2万
查看次数

我可以像 Spring 一样使用 CDI 和 @PersistenceContext 注入 JPA EntityManager 吗?

在 Spring 中,我可以javax.persistence.EntityManager 使用 annotation将 an 注入到 Spring bean 中@javax.persistence.PersistenceContext,如下所示:

@Service
public class MyRepository {
    @PersistenceContext
    private EntityManager entityManager;
}
Run Code Online (Sandbox Code Playgroud)

这在 Spring 文档的第20.5.2实现基于普通 JPA 的 DAO 中有所记录。

如果我不使用 Java EE 容器,有没有办法使用 CDI(特别是 Weld)来做到这一点?

特别是,是否可以重用@PersistenceContextCDI的注释(因为现有代码将它与 Spring 一起使用)?

据我了解:使用 Java EE 容器时,容器会解释注解并注入 EntityManager。那是对的吗?有没有办法在没有 Java EE 容器的情况下使用 Weld 使其工作?


我尝试使用 Weld(在 Tomcat 中,没有 Java EE)将上面的类注入到另一个类中。发生了注入,因此 Weld 正确创建了 的实例MyRepository,但是字段MyRepository.entityManagernull,就好像注释@PersistenceContext被忽略了一样。

这里发生了什么(或者更确切地说,没有发生)?

spring jpa weld jakarta-ee

3
推荐指数
2
解决办法
3575
查看次数

标签 统计

cdi ×1

ejb ×1

jakarta-ee ×1

java ×1

java-ee ×1

jpa ×1

jta ×1

spring ×1

weld ×1