我试图在CDI类中使用@Transactional
方法,而不是EJB:
@javax.inject.Named
// fails @javax.enterprise.context.ApplicationScoped
// fails @javax.enterprise.context.SessionScoped
// works @javax.ejb.Singleton
// works @javax.ejb.Stateless
public class SomeClass {
@javax.persistence.PersistenceContext
private EntityManager em;
@javax.annotation.PostConstruct
@javax.transaction.Transactional
public void someMethod() {
em.persist(someEntity);
}
}
当我使用SomeClass
或@Singleton
注释@Stateless
时,一切正常。
当我使用SomeClass
或@ApplicationScoped
注释@SessionScoped
时,WildFly 13会显示以下错误消息:
需要事务来执行此操作(使用事务或扩展持久性上下文)
自从Java EE 7以来@Transactional
与CDI一起工作的印象让我错了?或者我只是缺少一些额外的配置?
答案 0 :(得分:4)
我会尝试提供一个简短的列表,在尝试使@Transactional
与CDI一起工作时要注意,以便给出答案比评论更有价值:
javax.transaction.Transactional
,而不是javax.ejb.TransactionAttribute
!javax.transaction.Transactional
的jar,例如在WEB-INF / lib。@Transactional
通过最新的JTA规范实现为CDI拦截器。因此:
@PostConstruct
[这就是本问题中的问题],并且在调用this
对象的方法时, NOT 被激活,请注意!