Debugging JSF<;ui:debug>;不显示CDI bean
当我将托管bean定义为cdibean(@Named)时,ui:debug弹出窗口不会显示它。如果我将定义更改为JSF@ManagedBean,它将在作用域变量中显示。 我还需要做些什么来完成这项工作吗?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
我使用的是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.
// ...
}