执行不在事务中的有状态会话 bean 的 @PostConstruct 方法(在 Arquiillian 测试中)?



我有一个无状态的会话豆,

@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 事务属性。

因此,您只能进行全新的交易,或者根本没有交易。

如果您试图解决此问题,那么您不是在模拟您的运行时环境。

相关内容

最新更新