2015-11-02 41 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中列出。