JSF 2.0从另一个Bean访问Application Scope bean

时间:2011-05-23 08:29:22

标签: jsf-2

我正在使用jsf 2.0,我有两个bean导航(应用程序范围)和模块(请求范围)。我想在Module Bean中使用Navigation bean的方法。我这样做 在模块Bean

 @ManagedProperty(value = "#{navigationBean}")
    private NavigationBean navigationBean;

但是当我试图获取navigationBean.SomeMethod时,由于导航bean为null,因此无效。怎么做?

3 个答案:

答案 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" });

`