2013-06-19 3 views
0

EJB 주입을 지원하지 않는 다른 프레임 워크에 EE5를 연결하는 주입 스타일 메커니즘을 생성하려고합니다. 현재 내가 JNDI에서 EJB를 찾기 위해 사용자 정의 주석 및 명명 규칙을 사용하고 있습니다 :EJB 컨테이너에서 특정 인터페이스 구현을 검색하십시오.

@ContainerResource 
private LocalListener listener; 

@Initialize 
public void init(){ 
    new Injection<InjectionAction>().inject(this); 
} 

주입 클래스 :

public class Injection<T> { 

public void inject(T clazz) { 
    for(Field field : clazz.getClass().getDeclaredFields()){ 
     if(field.isAnnotationPresent(ContainerResource.class)){ 
      Object resource = findResource(field); 
      try { 
       field.setAccessible(true); 
       field.set(clazz, resource); 
      } catch (IllegalArgumentException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 


} 

private Object findResource(Field field) { 
    Object resource = null; 
    try { 
     InitialContext ic = new InitialContext(); 
     resource = ic.lookup(field.getType().getSimpleName()+ "Impl/local"); 

    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return resource; 



} 

}

내가 더 강력한을 찾을 싶습니다 메서드를 사용하여 명명 규칙을 사용하지 않고 해당 컨테이너의 로컬 인터페이스를 기반으로 컨테이너를 검색합니다.

+0

나는 가장 가능성이 높습니다. 내 작업에서 다른 경로. 그 결정에 앞서, 내가 생각하고 있던 아이디어 중 하나는 사용자 정의 코드가 액세스 할 수있는 가능한 모든 빈을 주입하는 일종의 집계기 EJB를 작성하는 것이었다. 그런 다음 EJB를 JNDI로 참조하고 그 내용 (의사 컨텍스트)을 검색하십시오. 나는이 질문을 보는 누군가에게 실행할 수있는 대안을 제공하려는 시도에이 의견을 포함 시켰지만, 답으로서의 자격이 있는지 확신 할 수 없다. – jake

답변

1

당신의 문제를 이해하고 있는지는 잘 모르겠지만 JNDI 레지스트리에서 객체를 찾으려면 유일한 방법은 그의 이름을 따온 것이므로 이름을 알고 있거나 의존해야합니다. 이름 관례.

내부적으로 EJB 삽입은 JNDI를 사용하여 구현되며 이름 규칙에도 의존합니다. 매개 변수없이 주석 @EJB를 사용하는 경우 컨테이너는 로컬 인터페이스 이름을 사용하여 개체를 찾거나 명시 적으로 사용 된 바인딩 이름을 @EJB (name = "myBeanJNDIbindigName")로 지정할 수 있습니다.

+0

EJB를 "주입"하고자하는 코드가 EJB를 인식하지 못하고 @EJB 주석을 처리하지 않는 시스템에 배포되고 있습니다. EJB가 내부적으로 명명 규칙에 의존한다는 사실을 알지 못했지만이를 조사해야합니다. 나는 그것을 유형 기반으로 만들고 싶었다. – jake

관련 문제