我正在编写一个Web应用程序,我正在使用JSF 2.0和hibernate 3.5。我的问题是当我想要注射一个没有被注射的豆时。
这是我想要注入的类(我只复制了重要的部分):
@ManagedBean(name="permissionBean", eager = true)
@SessionScoped
public class PermissionBean {
private List<Role> rolesList;
public PermissionBean(){
refresh();
}
private void refresh(){
rolesList = Role.queryRolesList();
}
public void test(){
System.out.println("__________TEST ");
}
//getter setter for the rolesList
}
进入这个:
@ManagedBean(name="triggerBean")
@SessionScoped
public class Trigger extends EmptyInterceptor {
@ManagedProperty(value="#{permissionBean}")
public PermissionBean pb;
public void onDelete(..) {
pb.test();
}
public void setPb(PermissionBean pb) {
System.out.println("______setting bean");
this.pb = pb;
}
}
第二个类是hibernate的拦截器类。程序启动并运行,我确信正在构造PermissionBean,因为我正在使用它中的方法,我看到了列表。但是当我尝试从中删除时,onDelete()
函数触发器我得到一个空指针异常(在我调用pb.test()
的那一行)。经过一番尝试后,我将测试写入了setter,但该方法永远不会被调用。
答案 0 :(得分:0)
我想eager=true
就是问题所在。渴望真实&#39;只在应用程序范围的bean中有意义,我不知道它在会话作用域bean中有什么影响,因为它不是为此而设计的。但是从您的描述来看,它似乎会在您启动应用程序时创建一个对象,但此对象与您尝试从的Trigger
bean的对象不在同一会话上下文中访问它。
只要未在任何xhtml页面中引用PermissionBean
,Trigger
类中的managedProperty将保持null
。