2012-01-25 2 views
0

이 요구 사항이 있습니다. 싱글 톤 빈이 있고 일부 초기화를 수행하는 @PostConstruct로 주석 된 메소드가 있습니다. 초기화 중 하나는 DB에서 일부 값을 읽는 것이므로이 메소드에 DB에 액세스하는 서비스 빈인 Stateless Bean을 삽입하려고한다. 싱글 톤 빈에 필드로 비 상태 빈을 삽입하고 싶지는 않습니다. 왜냐하면이 메소드에서만 필요하기 때문입니다 (싱글 톤 빈에서는 아무 것도 없습니다). 이렇게하려면 내가 싱글 콩이 쓴 않았다싱글 톤 빈에 스테이트리스 빈을 주입합니다.

@Singleton 
public class MySingletonBean { 

    @PostConstruct 
    @EJB 
    public void init(SLSBService service) { /* use service to read from DB */ }; 
    ... 
} 

문제는 싱글 빈이 인스턴스화 할 수 없다는 것입니다. 어떤 생각? 미리 감사드립니다.

답변

1

@PostConstruct annotated (callback) 메쏘드는 실제로 모든 레퍼런스가 해석 된 후에 호출됩니다 (모든 bean이 삽입 됨). 나는이 구조가 작동한다고 생각하지 않습니다.

@PostConstruct를 제거하고 일반적인 세터 주입을 사용하면됩니다. 그러나 다른 주입 된 자원이 현재로서는 해결되지 않았 음을 알아 두십시오.

@EJB 
public void setService(SLSBService service){ 
    service.doSmg(); 
} 

@Stateless  
public class SLSBService{ 
    @PersistenceContext 
    private EntityManager em; 

    @TransactionAttribute(TransactionAttributeType.MANDATORY) 
    public void doSmg() { 
     Member member = new Member(); 
     member.setEmail("[email protected]"); 
     member.setName("fubu"); 
     member.setPhoneNumber("453454534535"); 
     em.persist(member); 
    } 
} 

/* 편집 */

는 그냥 시도 약간의 시간이 있었다. 메소드는 트랜잭션 내에서 실행되고 EntityManager (SLBService 내)가 제대로 삽입되므로 DAO에 사용할 수 있어야합니다. 그리고 다른 EJB에 대한 예상 참조가 아직 해결되지 않았으므로이를 유의해야합니다.