0

我有一个会话 bean:

<managed-bean>
    <managed-bean-name>mainMenuNavigationBean</managed-bean-name>
    <managed-bean-class>com.cloud.common.jsf.core.beans.MainMenuNavigationBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

我将它注入到请求 bean 中:

<managed-bean>
    <managed-bean-name>createAccountBean</managed-bean-name>
    <managed-bean-class>com.cloud.common.jsf.account.CreateAccountBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>mainMenuNavigationBean</property-name>
        <property-class>com.cloud.common.jsf.core.beans.MainMenuNavigationBean</property-class>
        <value>#{mainMenuNavigationBean}</value>
    </managed-property>
</managed-bean>

现在,我正在尝试在我的 createAccountBean 的 @PostConstruct 中使用设置器,但我不明白为什么 mainMenuNavigationBean在这里为空...我希望在访问 createAccountBean 时自动创建它

    @PostConstruct
    public void init() {
        userLoginVo = new UserLoginVo();
        //NPE here
        mainMenuNavigationBean.setExternalPage(true);
    }

你能给我一个提示吗?我不明白我做错了什么......

4

1 回答 1

0

为了<managed-property>正常工作,您需要确保要注入的 bean 是一个public具有(隐式)public默认构造函数的类,该构造函数在构造时不会抛出任何异常。

public class MainMenuNavigationBean {

    public MainMenuNavigationBean() {
        // Can even be omitted altogether if you don't have other constructors.
    }

    // ...
}

并且您需要确保接受器具有有效的属性和有效的设置器。

public class CreateAccountBean {

    private MainMenuNavigationBean mainMenuNavigationBean;

    public void setMainMenuNavigationBean(MainMenuNavigationBean mainMenuNavigationBean) {
        this.mainMenuNavigationBean = mainMenuNavigationBean;
    }

    // ...
}

注意thissetter 中的,如果你省略了,setter 没有效果。

于 2011-05-26T12:49:30.353 回答