我正在使用jsf 2.0,我有两个bean导航(应用程序范围)和模块(请求范围)。我想在Module Bean中使用Navigation bean的方法。我这样做 在模块Bean
@ManagedProperty(value = "#{navigationBean}")
private NavigationBean navigationBean;
但是当我试图获取navigationBean.SomeMethod
时,由于导航bean为null,因此无效。怎么做?
答案 0 :(得分:20)
两个bean都需要是一个值得信赖的@ManagedBean
。接受者应该为注入的bean使用公共setter方法。注入的bean仅在@PostConstruct
及更高版本中可用(即在所有正常事件方法中,但在接受者的构造函数中不)。
所以,这应该有效:
@ManagedBean
@ApplicationScoped
public class Navigation {
// ...
}
@ManagedBean
@RequestScoped
public class Module {
@ManagedProperty(value="#{navigation}")
private Navigation navigation;
@PostConstruct
public void init() {
navigation.doSomething();
}
public void setNavigation(Navigation navigation) {
this.navigation = navigation;
}
}
答案 1 :(得分:4)
我认为@ManagedProperty
需要使用公共集方法。
答案 2 :(得分:1)
我得到了解决方案
我在应用程序签名中有一个方法boolean getReadAccess(String role,String module)。如果我想在另一个bean中使用,那么我必须遵循这些步骤
`javax.el.MethodExpression readAccess;
javax.el.ELContext elContext = null;
javax.faces.context.FacesContext context = FacesContext.getCurrentInstance();
elContext = ((FacesContext) context).getELContext();
javax.faces.application.Application application = FacesContext.getCurrentInstance().getApplication();
javax.el.ExpressionFactory expressionFactory = application.getExpressionFactory();
readAccess = expressionFactory.createMethodExpression(elContext,
"#{navigationBean.getReadAccess}", Void.class, new Class[] {
String.class, String.class });
//--------Call----------------------------
return (Boolean) readAccess.invoke(elContext, new Object[] {
"roleName", "moduleName" });
`