2011-05-18 59 views
2

我有一个会话beanauto -instantiate会话bean?

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

现在,我注入这个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似乎已经初始化。

现在的问题是:如何在访问providerSelectionBean bean时强制vdcAddBean被初始化(如果为空)?

谢谢。

+0

您是否试图访问providerSelectionBean的Constructor中的vdcAddBean并获取空指针?如果是这样,你可以将依赖于vdcAddBean的逻辑移入setVdcAddBean()方法并避免NP。 – 2011-05-18 11:38:35

回答

2

更换

<value>#{sessionScope.vdcAddBean}</value> 

通过

<value>#{vdcAddBean}</value> 

获得JSF到AUTOCREATE豆。

+0

是的,你当然是对的,最好避免这样的解决方案。 – 2011-05-18 11:52:02

+0

哇,,,非常感谢......真是太棒了! – 2011-05-18 12:31:26

+0

不客气。 – BalusC 2011-05-18 12:36:04

1

JSF托管会话bean存储在ExternalContext中,您可以使用以下方法getSessionMap检索包含它们全部的地图。

该映射的关键应该是托管bean名称,所以也许你可以检查null,如果是的话尝试实例化你的bean并将其直接放入sessionMap中?

+0

确实,谢谢:'FacesContext.getCurrentInstance()。getExternalContext()\t \t \t .getSessionMap()。put(“vdcAddBean”,vdcAddBean);' – 2011-05-18 11:26:55

+1

这是一个黑客/解决方法。 – BalusC 2011-05-18 11:47:30