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

#jsf #jsf-1.2

Вопрос:

У меня сеанс боб:

 <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, при доступе к createAccountBean

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

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

Комментарии:

1. Должно сработать. Ты бежишь так faces-config.xml , как думаешь, что бежишь? Сохранить/перестроить/повторно развернуть/перезапустить/и т.д. Также прочитайте журналы сервера для любых предупреждений, чтобы быть уверенным.

Ответ №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 , что в сеттере, если вы опустите это, сеттер не будет иметь никакого эффекта.