我尝试在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);
}
}
当我用@Singleton
或@Stateless
注释SomeClass
时,一切都正常。
当我使用@ApplicationScoped
或@SessionScoped
注释SomeClass
时,WildFly 13显示以下错误消息:
执行此操作需要
事务(使用事务或扩展持久性上下文)
我的印象是,从JavaEE7开始,@Transactional
就可以使用CDI了。或者我只是遗漏了一些额外的配置?
发布于 2018-06-08 05:13:57
我将尝试给出一个简短的列表,在尝试让@Transactional
与CDI一起工作时需要注意的事情,以便给出比注释更有价值的答案:
javax.transaction.Transactional
,而不是javax.ejb.TransactionAttribute
,后者适用于EJB!javax.transaction.Transactional
的jar。如果您想在非完整的JEE环境中使用它,您将需要在classpath.@Transactional
中使用它,并根据最新的JTA规范将其实现为一个CDI拦截器。因此:this
对象BEWARE!!!的方法时,它不会被激活
https://stackoverflow.com/questions/50749430
复制相似问题