2015-11-02 45 views
3

我使用javax.inject.Namedjavax.enterprise.context.*Scopedorg.omnifaces.cdi.ViewScoped来定义我的view-beans的生命范围。在运行时获取所有初始化@命名豆列表

现在我想获得所有实例化bean的列表。首先,我认为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); 
// ... 

关键是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中列出。