Получить список всех инициализированных @Named- beans во время выполнения

Я использую javax.inject.Named и javax.enterprise.context.*Scoped plus org.omnifaces.cdi.ViewScoped, чтобы определить жизненный масштаб моего представления - beans.

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

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

С уважением, Рокко

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

Ответ 1

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

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

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

Для технически заинтересованных здесь конкретная реализация этого метода утилиты:

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.