0

我很难理解我应该如何处理在 Jboss EAP 7 实例上运行的 JTA 和 CDI。我可以通过注入来自容器的 UserTransaction 对象来手动获取事务,但是当我使用 @Transactional 注释该方法时,我得到一个关于没有可用事务的异常......我的问题是。是否缺少任何配置?我简要地阅读了也许我应该自己创建一个拦截器以使其工作,但我还没有找到任何一致的例子......

4

1 回答 1

0

在默认的 JEE 容器管理环境中,只有企业 bean(通常@Stateless使用 bean)是事务性的。一旦你从外部输入这样一个 bean,事务就会打开。使用@javax.transaction.Transactional注释,您可以控制事务的行为,但在默认情况下这不是必需的。

示例豆:

@Stateless
public MyBean {
   public void withinTransaction() {
     System.out.println("i'm running within a transaction");
   }
   @Transactional(TxType.NOT_SUPPORTED)
   public void outsideTransaction() {
     System.out.println("no transaction available...");
   }
}
  • 如果您MyBean.withinTransaction从 Servlet 调用(例如通过 REST),则会创建一个新事务(如果尚不存在)。
  • 如果您调用MyBean.outsideTransaction,则不会创建任何事务。
  • 如果您调用this.outsideTransaction()from withinTransaction,您仍然可以使用事务outsideTransaction(因为拦截器仅绑定到 bean 边界)
  • 如果您this.withinTransaction()outsideTransaction没有创建新事务调用(因为拦截器仅绑定到 bean 边界)
  • 如果outsideTransaction将是第二个 bean 的一部分AnotherBean,即@Injects MyBean,并且您调用MyBean.withinTransaction,则将创建一个新事务(如果尚不存在)。AnotherBean.outsideTransaction因为您跨越和之间的bean 边界MyBean.withinTransaction
于 2017-02-10T15:44:00.750 回答