2017-10-02 12 views
0

、Arquillianテストにおいて(Arquillianテストで)トランザクションではなくステートフルセッションBeanの@PostConstructメソッドを実行しますか?私はステートレスセッションBeanを有する

@Stateless 
public class MyService { 

    @PersistenceContext 
    private EntityManager entityManager; 

    @PostConstruct 
    public void init() { 
     Language language=new Language(); 
     language.setName("Foo"); 
     entityManager.persist(language); 
    } 
    ... 

IはCDI豆(@RequestScoped豆)、@Injectsこのサービスを持っています。このテストは正常に実行されます。私は@Stateful BeanにこのBeanを変更すると

はしかし、私はエラーメッセージを取得する:私は@PostConstruct方法に@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)注釈を入れ

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) 

は、テストがOKに実行されます。しかし、これは私がしたいことではありません。

また、initメソッドから@Postconstructを削除し、Arquillianテストでinitメソッドを明示的に呼び出すことができます。その後、initメソッドはトランザクション中です。

ステートフルセッションBeanのトランザクションは実行されず、ステートレスBeanのメソッドは実行されません(@PostConstruct)。

答えて

0

EJB 3.2のコア契約および要件仕様は§8.3.7に次のように述べている:

ステートフルセッションBeanのPostConstruct、PreDestroy、PrePassivateまたはPostActivateライフサイクル・コールバック・インターセプタ・メソッドの場合

、唯一REQUIRES_NEWやNOT_SUPPORTEDトランザクション属性を使用することができます。

したがって、新しい取引を行うことも、全く取引を行うこともできません。

これを回避しようとしている場合は、ランタイム環境をエミュレートしていません。

+0

"通常の"メソッド( '@ PostConstruct'などのアノテーションなしのメソッド? – ericj

+0

の' @ Stateful' Beanの場合は、yes)として、 '@ PostConstruct'メソッドはCMTトランザクションでは実行されません。彼らは '@ Stateless' beanよりはるかに精巧なライフサイクルを持っています。 –

関連する問題