JSF <ui:debug>没有显示CDI bean </ui:debug>

时间:2013-11-17 23:07:00

标签: debugging jsf facelets cdi managed-bean

当我将托管bean定义为CDI bean(@Named)时,ui:debug弹出窗口不会显示它。如果我将定义更改为JSF @ManagedBean,它就会显示在范围变量中。 我还需要做些什么来使这项工作成功吗? 我正在使用Mojarra 2.1。

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.

    // ...
} 

请记住,这是一项相对昂贵的工作。所以真的只用它来调试。