2015-11-02 7 views
3

Я использую и javax.enterprise.context.*Scoped плюс org.omnifaces.cdi.ViewScoped, чтобы определить сферу жизни моего вида bean.Получить список всех инициализированных @ Именованные бобы во время выполнения

Теперь я хочу получить список всех экземплярных beans. Во-первых, я подумал, что this blog-entry охватывает эту проблему, но в ней перечислены только @ManagedBeans.

Вы знаете, как их перечислить? Возможно ли это, не будучи зафиксированным на реализации или даже версии JavaEE?

С наилучшими пожеланиями, Рокко

PS: Я уже нашел org.omnifaces.cdi.BeanStorage, но я не имею никакого представления, как получить доступ к своей карте.

ответ

4

Учитывая, что вы используете OmniFaces, вы можете использовать метод Beans#getActiveInstances() для Beans utility class, чтобы получить все активные экземпляры в заданной области CDI.

Map<Object, String> activeViewScopedBeans = Beans.getActiveInstances(ViewScoped.class); 
// ... 

Ключ - это экземпляр компонента, а значение - имя компонента.

Для технически интересно, вот concrete implementation этого метода полезности:

public static <S extends Annotation> Map<Object, String> getActiveInstances(BeanManager beanManager, Class<S> scope) { 
    Map<Object, String> activeInstances = new HashMap<>(); 
    Set<Bean<?>> beans = beanManager.getBeans(Object.class); 
    Context context = beanManager.getContext(scope); 

    for (Bean<?> bean : beans) { 
     Object instance = context.get(bean); 

     if (instance != null) { 
      activeInstances.put(instance, bean.getName()); 
     } 
    } 

    return Collections.unmodifiableMap(activeInstances); 
} 

BeanStorage предназначен только для внутреннего использования. Более того, он не указан в showcase.