2010-01-07 3 views
13

오늘 오후에 완전한 터보가되어 어디서나 답을 찾을 수없는 것 같습니다.POJO에 EJB 3.1 @EJB 주입

새로운 EJB 3.1 스펙을 사용하면 EJB를 pojo에 삽입 할 수 있습니까? 나는 EJB 3.0에서 @EJB 주석을 사용하여 EJB를 주입 할 수 있다는 것을 알고 있지만 이것은 간단한 pojos에서는 작동하지 않는다.

새 키워드를 사용하는 것이 간단하지 않다는 것을 알고 있으므로 JNDI에서 콩을 찾아야합니다.

미리 감사드립니다.

Karl

+0

CDI를 사용하고 있습니까? http://java.sun.com/javaee/6/docs/tutorial/doc/giwhb.html –

답변

19

예, JNDI 조회를 사용하십시오.

귀하의 POJO가 귀하에 의해 작성되었으므로 (해당 가정) 컨테이너는 종속성을 주입 할 책임이 없습니다.

+0

Java EE 5의 모든 구현이 @Local Bean을 JNDI 트리에 게시 할 수있는 것은 아닙니다. 내가 알 수있는 한 그것은 스펙의 선택적 기능입니다. WebLogic 11g에는 이러한 일이 일어나지 않으므로 주입 된 리소스를 생성자 인수로 POJO에 전달합니다. – BonanzaOne

7

새 EJB 스펙 (3.1)은 EJB에 대해 전역 JNDI 이름을 지정할 수있는 기능을 추가합니다. 즉, 어디서나 빈에서 사용할 수 있습니다.

EJB 3.1 컨테이너는 POJO에 대해 알지 못하기 때문에 명확한 JNDI 조회를 수행해야합니다.

내가 추측하는 유일한 예외는 POJO가 실제로 응용 프로그램 클라이언트 인 경우입니다.이 경우 EJB를 포함 할 필드가 정적 인 경우, @EJB를 적용 할 수 있습니다 그것에 대한 주석. 그렇다면 전체 Java EE 5 사양에서 응용 프로그램 클라이언트 규칙을 확인해야합니다.

마지막으로 JSR-299가 포함 된 Java EE 6은 사용자가 기술 한 것을 어떤 식 으로든 처리 할 수 ​​있습니다. 나는 사양을 아직 모르지만 그것에 대해 언급 할 수는 없다.

나는 이것이 모두 도움이되기를 바랍니다.

+1

이전 버전의 Java EE (심지어 J2EE)에서도 어디서나 조회를 수행 할 수있었습니다. EJB 3.1은이를 변경하지 않습니다. Java EE 6의 새로운 기능은 CDI를 사용하여 관리되는 모든 것을 만들 수 있으며 CDI 빈에 주입 할 수 있다는 것입니다. –

+1

이전 버전의 Java EE는 전역 JNDI 이름 지정 구문을 지정하지 않았습니다. 또한 애플리케이션 클라이언트가 아닌 원격 클라이언트가 JNDI에서 어떤 것도 찾을 수 있어야한다는 요구 사항을 만들지 않았습니다. –

1

inject EJBs into unmanaged objects도 궁금합니다. 자세한 내용은 Weld (JSR 299 참조 구현) 설명서를 참조하십시오.

그러나이 같은 저장소 또는 공장 내부에 손으로 의존성 주입을 수행 할 수 있습니다

@Stateless 
public PojoRespository { 

    @Inject 
    ResourceForPojos resource; 
    @PersistenceContext 
    private EntityManager em; 

    public Pojo findById(Object id) { 
    Pojo p = (Pojo) em.find(Pojo.class, id); 
    p.setResource(resource); // injects resource 
    return p; 
    } 

} 

당신이 주사가 수행해야 많은 방법이있는 경우, 당신은 인터셉터를 사용할 수 있습니다.

28

새로운 EJB 3.1 스펙을 사용하면 EJB를 pojo에 삽입 할 수 있습니까? 나는 EJB 3.0에서 @EJB 주석을 사용하여 EJB를 주입 할 수 있다는 것을 알고 있지만 이것은 간단한 pojos에서는 작동하지 않는다. 당신의 POJO는 CDI가 관리 Bean 인 경우 즉, JSR-299 (자바 C ontexts 및 D ependency I njection)를 사용 경우 POJO에 EJB의

주입이 가능합니다. 이 경우 다음을 수행 할 수 있습니다.

@Inject MyEJB service 

그러나 이것은 EJB 3.1 기능이 아닙니다. 이는 CDI에서 가져온 것입니다. CDI를 사용하지 않는다면 조회를해야합니다.

관련 문제