2012-10-24 4 views
0

Maven 프레임 워크를 사용하여 프로젝트를 빌드하고 EJB 3.0이 EJB 스펙입니다. I는 A를 구현하는 EJB 인터페이스 (A)와 그것의 대응 EJB 클래스 B가 클래스 B의 본체 아래에 도시되어있다 : 비 EJB 클래스에서 EJB 객체를 인스턴스화하는 방법은 무엇입니까?

@Stateless 
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
class B implements A{ 

     @PersistenceContext(unitName = "Draco-PU", type = PersistenceContextType.TRANSACTION) 
    EntityManager entityManager; 

     //called post construct 
     @PostConstruct 
     public init(){ 

      //body of init method 

     } 

제가 동일한 프로젝트 하에서 다른 패키지의 비 EJB 클래스를 갖는다. 이 클래스에서 클래스 B를 인스턴스화하여 init() 메서드 및 기타 주석이 자동으로 참조되도록하고 EJB 클래스의 다른 메서드에 대한 명시 적 호출을 제공 할 수 있습니다. 도와주세요.

답변

1

당신은 그렇게 할 수 없습니다. NonEJBClass.someMethod()의 호출자는 A를 someMethod에 전달해야합니다 (호출자가 삽입 또는 조회했기 때문에). 또는 someMethod가 조회를 수행해야합니다 (아마도 "java :"네임 스페이스 중 하나에 있음). 이 관리되지 않는 클라이언트에서 사용할 수 있도록 그렇지 않으면, 당신은 당신의 빈을 변경해야합니다, 예를 들면 :

콩 :

@Stateless 
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW) 
class B implements A { 
    private EntityManager entityManager; 

    @PersistenceContext(unitName = "Draco-PU", type = PersistenceContextType.TRANSACTION) 
    public void setEntityManager(EntityManager em) { 
     entityManager = em; 
    } 

    @PostConstruct 
    public init() { 
     //body of init method 
    } 
} 

관리되지 않는 클라이언트 : 그래서

B obj = new B(); 
obj.setEntityManager(...); 
obj.init(); 

, 당신은 허용 하나 (그리고 모든 주입과 초기화를 처리한다.) 객체를 생성한다. 그리고 객체를 생성한다. 그리고 setter 호출과 초기화를 처리한다.

+0

비 EJB 클래스에서 조회를 수행 할 수 있습니까? – San

+0

그렇게 할 수는 있지만, EJB가 자신의'java : comp' (managed)와 호출자 인'java : comp' (servlet?)에서 룩업을 수행하는 어색한 입장에 처해있다. 나는 그것이 너무 혼란 스러울 것이라고 생각한다. –

+0

죄송합니다, 잘못 읽었습니다 : 예, EJB가 아닌 클래스가 EJB를 검색 할 수 있습니다. 예를 들어 비 EJB 클래스가 서블릿에서 항상 호출되는 경우, 예를 들어 서블릿에서 EJB 참조를 선언하면 비 EJB 클래스는 EJB 참조를 'java : comp'에서 찾을 수 있습니다. –