我使用javax.inject.Named并javax.enterprise.context.*Scoped加org.omnifaces.cdi.ViewScoped来定义我的观点豆的生活范围.
现在我想获得所有实例化bean的列表.首先,我认为这篇博客文章涵盖了这个问题,但它只列出了@ManagedBeans.
你知道如何列出它们吗?如果不修复JavaEE的实现甚至版本,这是否可行?
亲切的问候,六甲
PS:我已经找到了org.omnifaces.cdi.BeanStorage,但我不知道如何访问它的地图.
鉴于您正在使用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仅供内部使用.此外,它没有在展示中列出.
| 归档时间: |
|
| 查看次数: |
408 次 |
| 最近记录: |