在运行时获取所有已初始化的@ Named-beans列表

Rok*_*_11 4 jsf cdi omnifaces

我使用javax.inject.Namedjavax.enterprise.context.*Scopedorg.omnifaces.cdi.ViewScoped来定义我的观点豆的生活范围.

现在我想获得所有实例化bean的列表.首先,我认为这篇博客文章涵盖了这个问题,但它只列出了@ManagedBeans.

你知道如何列出它们吗?如果不修复JavaEE的实现甚至版本,这是否可行?

亲切的问候,六甲

PS:我已经找到了org.omnifaces.cdi.BeanStorage,但我不知道如何访问它的地图.

Bal*_*usC 5

鉴于您正在使用OmniFaces,您可以使用实用程序类的Beans#getActiveInstances()方法来获取给定CDI范围内的所有活动实例.Beans

Map<Object, String> activeViewScopedBeans = Beans.getActiveInstances(ViewScoped.class);
// ...
Run Code Online (Sandbox Code Playgroud)

关键是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);
}
Run Code Online (Sandbox Code Playgroud)

BeanStorage仅供内部使用.此外,它没有在展示中列出.