2017-10-02 3 views
0

하는 Arquillian 테스트에서트랜잭션 (Arquillian 테스트에서)이 아닌 Stateful Session Bean의 @PostConstruct 메소드를 실행합니까? 내가 무 상태 세션 빈을

@Stateless 
public class MyService { 

    @PersistenceContext 
    private EntityManager entityManager; 

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

은 내가 CDI 콩 (@RequestScoped 콩), @Injects이 서비스가있다. 이 테스트는 정상적으로 실행됩니다. 나는 @Stateful 콩이 콩을 변경할 때

는, 나는 오류 메시지를 얻을 : 나는 @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) 

는, 테스트 확인을 실행합니다. 그러나 이것은 내가하고 싶은 것이 아닙니다.

또한 init 메서드에서 @Postconstruct을 제거하고 Arquillian 테스트에서 init 메서드를 명시 적으로 호출 할 수 있습니다. 그런 다음 init 메소드가 트랜잭션에 있습니다.

그래서 트랜잭션이 아닌 상태 저장 빈의 @PostConstruct 메소드를 실행합니다.

답변

0

은 EJB 3.2 코어 계약 및 요구 사항 명세의 상태를 다음 §8.3.7에서 : 상태 유지 세션 빈의 PostConstruct의, PreDestroy, PrePassivate 또는 PostActivate 라이프 사이클 콜백 인터셉터 방법에 대한

만 REQUIRES_NEW 및 NOT_SUPPORTED 거래 속성이 사용될 수 있습니다.

그래서 새로운 거래가 있거나 전혀 거래하지 않을 수 있습니다.

이 문제를 해결하려면 런타임 환경을 에뮬레이션하지 않아야합니다.

+0

"정상적인"방법 ('@ PostConstruct' 등의 주석이없는 메소드? – ericj

+0

'@ Stateful' beans의 경우,'@ PostConstruct' 메소드는 CMT 트랜잭션에서 실행되지 않습니다. 그들은'@ Stateless' 빈보다 훨씬 정교한 생명주기를 가지고 있습니다. –