Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging JSF<;ui:debug>;不显示CDI bean_Debugging_Jsf_Facelets_Cdi_Managed Bean - Fatal编程技术网

Debugging JSF<;ui:debug>;不显示CDI bean

Debugging JSF<;ui:debug>;不显示CDI bean,debugging,jsf,facelets,cdi,managed-bean,Debugging,Jsf,Facelets,Cdi,Managed Bean,当我将托管bean定义为cdibean(@Named)时,ui:debug弹出窗口不会显示它。如果我将定义更改为JSF@ManagedBean,它将在作用域变量中显示。 我还需要做些什么来完成这项工作吗? 我使用的是Mojarra 2.1。CDI托管bean不会存储为请求/会话/应用程序范围的直接属性。它们被抽象到CDI上下文后面,而CDI上下文又依赖于实现(例如,Weld vs OpenWebBeans vs others)它们在范围中的引用方式。不提供任何内置工具来显示活动的CDI管理的be

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

CDI托管bean不会存储为请求/会话/应用程序范围的直接属性。它们被抽象到CDI上下文后面,而CDI上下文又依赖于实现(例如,Weld vs OpenWebBeans vs others)它们在范围中的引用方式。
不提供任何内置工具来显示活动的CDI管理的bean(还没有?)

您最好的选择是手动获取它们。您可以使用以下实用程序方法(将在即将推出的1.7版
Beans
utility类中提供):

公共静态映射getActiveReferences(BeanManager BeanManager,类bean:beans){ 对象引用=context.get(bean); 如果(引用!=null){ activeReferences.put(reference,bean.getName()); } } 返回集合。不可修改映射(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.

    // ...
} 
@Inject
私人BeanManager;
公开募捐{
映射requestScopedBeans=Beans.getActiveReferences(管理器,RequestScoped.class);
//Map键表示实例,Map值表示托管bean名称(如果有)。
// ...
} 

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

您是否也给了它一个作用域?当您从
@ManagedBean
切换到
@Named
时,是否将JSF作用域切换为CDI作用域?是的,两者都是sessionScope(分别在javax.faces.bean和javax.enterprise.context中)
@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.

    // ...
}