2013-11-15 4 views
6

저의 목표는 JSF2 ExceptionHandlerWrapper 내에서 (특정 상위 클래스의) 모든 인 서비스 CDI 관리 빈 컬렉션을 얻는 것입니다. 클래스가 유효한 주입 대상 자체가 아니기 때문에 예외 처리기 부분이 중요합니다. 그래서 내 가정 (어쩌면 틀린)은 내 유일한 경로가 BeanManager를 통해 프로그래밍 방식이라는 것입니다.서비스중인 CDI 관리 빈 만 가져 오기

BeanManager.getBeans를 사용하여 주입에 사용할 수있는 모든 콩 세트를 성공적으로 가져올 수 있습니다. 내 문제는 BeanManager.getReference를 사용하여 Bean의 컨텍스트 인스턴스를 가져올 때 이미 존재하지 않는 경우 Bean이 작성된다는 것이다. 그래서 인스턴스화 된 빈을 반환 할 대안을 찾고 있습니다. 아래 코드는 내가 빈 인스턴스에 대한 GET() 메소드의 두 가지 버전이 있습니다 Context을 발견 Javadoc을 통해 파고 ... 우리가 여기 내 출발점

public List<Object> getAllWeldBeans() throws NamingException { 
    //Get the Weld BeanManager 
    InitialContext initialContext = new InitialContext(); 
    BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager"); 

    //List all CDI Managed Beans and their EL-accessible name 
    Set<Bean<?>> beans = bm.getBeans(AbstractBean.class, new AnnotationLiteral<Any>() {}); 
    List<Object> beanInstances = new ArrayList<Object>(); 

    for (Bean bean : beans) { 
     CreationalContext cc = bm.createCreationalContext(bean); 
     //Instantiates bean if not already in-service (undesirable) 
     Object beanInstance = bm.getReference(bean, bean.getBeanClass(), cc); 
     beanInstances.add(beanInstance); 
    } 

    return beanInstances; 
} 

답변

7

입니다. 그 중 하나는 생성 컨텍스트에서 전달할 때 BeanManager.getReference()와 동일한 동작을합니다. 그러나 다른 하나는 Bean 참조를 취하여 컨텍스트 인스턴스 (사용 가능한 경우) 또는 null을 반환합니다.

public List<Object> getAllCDIBeans() throws NamingException { 
    //Get the BeanManager via JNDI 
    InitialContext initialContext = new InitialContext(); 
    BeanManager bm = (BeanManager) initialContext.lookup("java:comp/BeanManager"); 

    //Get all CDI Managed Bean types 
    Set<Bean<?>> beans = bm.getBeans(Object.class, new AnnotationLiteral<Any>() {}); 
    List<Object> beanInstances = new ArrayList<Object>(); 

    for (Bean bean : beans) { 
     CreationalContext cc = bm.createCreationalContext(bean); 
     //Get a reference to the Context for the scope of the Bean 
     Context beanScopeContext = bm.getContext(bean.getScope()); 
     //Get a reference to the instantiated bean, or null if none exists 
     Object beanInstance = beanScopeContext.get(bean); 
     if(beanInstance != null){ 
      beanInstances.add(beanInstance); 
     } 
    } 

    return beanInstances; 
} 
: 그 활용

, 여기에만 인스턴스화 콩을 반환 원래 메소드의 버전입니다