JSF 2.0:为什么我的ViewScope Bean重新创建,即使仍然在同一个视图

在我的.xhtml页面中,我有以下表格:

   

... ...

CustomerTemplate.xhtml是:

    ... // import css, js files   ... // Other things on the page 
...

这是我的ManagedBean:

 @ManagedBean @ViewScoped public class MrBean { ... private List items; ... @PostConstruct public void prepareItemList() { ... Map params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap(); partnerID = Long.parseLong(params.get("partnerID")); ... } } 

如您所见,我的MrBean是一个ViewScoped ManagedBean。 我预计@PostContruct函数只会在第一次呈现页面时调用一次。 但是,当我单击Add To Cart按钮时,我在Long.parseLong(params.get("partnerID"))行遇到了nullexception,即使我仍然在同一个View上。

如果有人能就如何解决这个问题给我一个建议,我将非常感激。

更新:我设法通过将commandButton包装在ajax标记内来使函数正常工作,如下所示:

 ...    .... 

这有很多可能的原因,最终归结为JSF问题1492中描述的鸡蛋问题。 您正在使用将UI组件绑定到视图范围的托管bean属性,或者绑定标记处理程序的属性,如等等到视图范围的托管bean属性。

这计划在JSF 2.2中修复。 在此之前,最好的办法是寻找替代方法或将上下文参数javax.faces.PARTIAL_STATE_SAVING设置为false

也可以看看:

  • JSF 2.0中的通信 – @ViewScoped在标记处理程序中失败