Ответ 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.