#jsf #jsf-1.2
#jsf #jsf-1.2
Вопрос:
У меня есть сеансовый компонент
<managed-bean>
<managed-bean-name>vdcAddBean</managed-bean-name>
<managed-bean-class>com.cloud.appsportfolio.jsf.vdc.beans.VDCAddBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Теперь я внедряю этот компонент в компонент запроса:
<managed-bean>
<managed-bean-name>providerSelectionBean</managed-bean-name>
<managed-bean-class>com.cloud.appsportfolio.jsf.sourcing.ProviderSelectionBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>vdcAddBean</property-name>
<property-class>com.cloud.appsportfolio.jsf.vdc.beans.VDCAddBean</property-class>
<value>#{sessionScope.vdcAddBean}</value>
</managed-property>
</managed-bean>
Ну, когда я обращаюсь к vdcAddBean в providerSelectionBean
коде Java, я получаю NPE, потому что vdcAddBean
он еще не инициализирован. Если я сначала захожу в свое меню, на страницу, которая есть vdcAddBean
в фоновом режиме, и возвращаюсь к providerSelectionBean
, все работает отлично, потому что кажется, что vdcAddBean
это уже было инициализировано.
Вопрос в следующем: как я могу принудительно инициализировать vdcAddBean (если оно равно null) при доступе к providerSelectionBean
компоненту?
Спасибо.
Комментарии:
1. Вы пытаетесь получить доступ к vdcAddBean в конструкторе providerSelectionBean и получаете нулевой указатель? Если это так, вы, вероятно, можете переместить логику, которая зависит от vdcAddBean, в метод setVdcAddBean() и избежать NP.
Ответ №1:
Заменить
<value>#{sessionScope.vdcAddBean}</value>
Автор:
<value>#{vdcAddBean}</value>
чтобы заставить JSF автоматически создавать компонент.
Комментарии:
1. Да, вы, конечно, правы, лучше избегать таких решений.
Ответ №2:
Сеансовые компоненты, управляемые JSF, хранятся внутри ExternalContext, вы можете получить карту со всеми из них, используя следующий метод, getSessionMap.
Ключом к этой карте должно быть имя управляемого компонента, поэтому, возможно, вы можете проверить наличие null, и если да, то попробуйте создать экземпляр вашего компонента и поместить его непосредственно в sessionMap?
Комментарии:
1. Действительно, спасибо:
FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("vdcAddBean", vdcAddBean);