【问题标题】:JSF 2.0 Accessing Application Scope bean from another BeanJSF 2.0 从另一个 Bean 访问应用程序范围 bean
【发布时间】:2011-05-23 08:29:22
【问题描述】:

我使用的是 jsf 2.0,我有两个 bean Navigation(Application Scope)和 Module(Request Scope)。我想在 Module Bean 中使用 Navigation bean 的方法。我正在这样做 在模块 Bean 中

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

但是当我尝试获取 navigationBean.SomeMethod 时,它无法正常工作,因为导航 bean 为 null 。如何做到这一点?

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    这两个 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;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      我认为@ManagedProperty 需要公共 set 方法才能工作。

      【讨论】:

        【解决方案3】:

        我得到了解决方案

        我在应用程序签名 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" });
        

        `

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-17
          • 1970-01-01
          • 2012-12-26
          • 2011-07-28
          • 2011-02-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多