我有一个无状态的会话豆,
@Stateless
public class MyService {
@PersistenceContext
private EntityManager entityManager;
@PostConstruct
public void init() {
Language language=new Language();
language.setName("Foo");
entityManager.persist(language);
}
...
在Arquillian测试中,我有一个CDI
豆(@RequestScoped
豆),它@Injects
这项服务。此测试运行正常。
但是当我将此豆子更改为@Stateful
豆时,我收到错误消息:
Caused by: javax.persistence.TransactionRequiredException: WFLYJPA0060: Transaction is required to perform this operation (either use a transaction or extended persistence context)
at service.MyServiceTest.testStateful(MyServiceTest.java:71)
当我在@PostConstruct
方法上放置@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
注释时,测试运行正常。但这不是我想做的。
此外,我可以从 init 方法中删除@Postconstruct
,并在 Arquiillian 测试中显式调用init
方法。然后init
方法在事务中。
那么运行不在事务中的有状态会话 bean 的@PostConstruct
方法,以及它运行的无状态 bean 的方法?
EJB 3.2 核心契约和需求规范在 §8.3.7 中声明如下:
对于有状态会话 Bean 的 PostConstruct、PreDestroy、PrePassivate 或 PostActivate 生命周期回调拦截器方法,只能使用 REQUIRES_NEW 和 NOT_SUPPORTED 事务属性。
因此,您只能进行全新的交易,或者根本没有交易。
如果您试图解决此问题,那么您不是在模拟您的运行时环境。