автоматическое создание экземпляра сеансового компонента?

#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);