【问题标题】:Weld and junit, no transactionmanagerWeld 和 junit,没有事务管理器
【发布时间】:2020-01-16 19:10:21
【问题描述】:

我有一些 junit 风格的集成测试,其中注入由 Weld 处理。我能够注入一个 entityManager 就好了,一切似乎都很好,当我的测试代码对我的 entityManager 执行一些操作时......除了实际上没有任何东西写入我的内存 H2 数据库......没有插入,更新任何事物。这是由于据我所知没有任何可用的交易。当我启动测试时,日志会通知我:

交易服务不可用。 @Inject UserTransaction 的注入不可用。事务性观察者将被同步调用。

有什么正常/典型的方法吗?我只发现了这个:https://in.relation.to/2019/01/23/testing-cdi-beans-and-persistence-layer-under-java-se/ 这有点接近我需要的东西(我在正在测试的代码中使用了@Transactional 注释),但似乎不得不重新发明轮子。真的没有简单的方法吗?

【问题讨论】:

标签: transactions integration-testing h2 junit4 weld


【解决方案1】:

如果UserTransaction 不可用,则很可能意味着您尚未配置事务管理器。 @Transactional@Inject UserTransaction 功能在 JTA 规范中定义,由事务管理器实现。

Weld 用于 WildFly,并与 Narayana 很好地集成在一起。这是您可以选择的一种选择(免责声明:我是http://narayana.io 项目的开发人员)。

当您的应用程序在独立模式下运行时,您需要在上面提供一点集成。起点是添加依赖

<groupId>org.jboss.narayana.jta</groupId>
<artifactId>cdi</artifactId>

然后您应该在其上实现 Weld SPI 接口(示例在 Narayana 快速入门中:https://github.com/jbosstm/quickstart/blob/master/jta-1_2-standalone/src/test/java/org/jboss/narayana/quickstarts/jta/cdi/CDITransactionServices.java

我为此写了一篇博文,您可以在此处找到更多详细信息:http://jbossts.blogspot.com/2019/04/jta-and-cdi-integration.html

如果您在将事务管理器依赖项拉入您的项目时遇到问题 - 我知道可能会担心将依赖项列表扩展得更大或对一些性能影响(即使我认为这种担心毫无根据,但这是不同的)讨论) - 那么您将需要配置您的EntityManager 以使用本地事务运行。在这里使用 &lt;non-jta-data-source&gt; 可能会有所帮助。 Hibernate 需要在事务内部运行插入查询。这是一个先决条件。

请注意,如果您将EntityManager 配置为使用资源本地事务,则测试可以开始工作,但您仍然不能使用@Inject UserTransaction@Transactional,因为它们是事务管理器提供的功能。

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    相关资源
    最近更新 更多