почему NPE в этом бобе? - PullRequest
0 голосов
/ 26 мая 2011

У меня есть сессионный компонент:

<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>

Я внедряю это в компонент запроса:

<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>

Теперь я пытаюсь использовать установщик в @PostConstruct моегоcreateAccountBean, но я не понимаю , почему mainMenuNavigationBean здесь имеет значение null ... Я ожидаю, что он будет создан автоматически, если null, при доступе к createAccountBean

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

Не могли бы вы дать мне подсказку, пожалуйста?Я не могу понять, что я делаю неправильно ...

1 Ответ

0 голосов
/ 26 мая 2011

Чтобы заставить <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;
    }

    // ...
}

Помните this в установщике, если выпропустите это, сеттер не имеет никакого эффекта.

...