Почему NPE в этом бобе?

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

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

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

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

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

1 ответ

Решение

Чтобы получить <managed-property> для правильной работы необходимо убедиться, что подлежащий инъекции компонент является 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 в установщике, если вы пропустите это, установщик не имеет никакого эффекта.

Другие вопросы по тегам