【问题标题】:Get list all initialized @Named-beans on runtime在运行时获取所有已初始化的 @Named-beans 列表
【发布时间】:2016-02-02 09:55:36
【问题描述】:

我使用javax.inject.Namedjavax.enterprise.context.*Scoped 加上org.omnifaces.cdi.ViewScoped 来定义我的视图bean 的生命范围。

现在我想获取所有实例化 bean 的列表。首先,我认为this blog-entry 涵盖了这个问题,但它只列出了@ManagedBeans

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

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

【问题讨论】:

    标签: jsf cdi omnifaces


    【解决方案1】:

    鉴于您使用的是 OmniFaces,您可以使用 Beans utility classBeans#getActiveInstances() 方法来获取给定 CDI 范围内的所有活动实例。

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

    键是bean实例,值是bean名称。

    对于技术上感兴趣的人,这里是这个实用方法的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中也没有列出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多