当我将托管bean定义为CDI bean(@Named)时,ui:debug弹出窗口不会显示它。如果我将定义更改为JSF @ManagedBean,它就会显示在范围变量中。 我还需要做些什么来使这项工作成功吗? 我正在使用Mojarra 2.1。
答案 0 :(得分:4)
CDI托管bean未存储为请求/会话/应用程序范围的直接属性。它们在CDI上下文之后被抽象出来,因此它依赖于实现依赖(例如,Weld vs OpenWebBeans vs其他)它们在范围内是如何被引用的。 <ui:debug>
没有提供任何内置功能来显示活动的CDI托管bean(但是?)。
您最好的选择是手动获取它们。您可以使用以下实用程序方法(将在即将发布的OmniFaces 1.7的Beans
实用程序类中提供):
public static Map<Object, String> getActiveReferences(BeanManager beanManager, Class<? extends Annotation> scope) {
Map<Object, String> activeReferences = new HashMap<Object, String>();
Set<Bean<?>> beans = beanManager.getBeans(Object.class);
Context context = beanManager.getContext(scope);
for (Bean<?> bean : beans) {
Object reference = context.get(bean);
if (reference != null) {
activeReferences.put(reference, bean.getName());
}
}
return Collections.unmodifiableMap(activeReferences);
}
以下是如何使用它:
@Inject
private BeanManager manager;
public void collect() {
Map<Object, String> requestScopedBeans = Beans.getActiveReferences(manager, RequestScoped.class);
// Map key represents the instance and map value represents the managed bean name, if any.
// ...
}
请记住,这是一项相对昂贵的工作。所以真的只用它来调试。