PARTIAL_STATE_SAVING应该设置为false吗?

时间:2012-04-26 15:55:40

标签: jsf-2 myfaces mojarra

似乎今天(2012年4月),MyFaces和Mojarra的JSF 2.1实现都存在部分状态保存方面的缺陷,并且PARTIAL_STATE_SAVING应该设置为false。

这是真的吗?

1 个答案:

答案 0 :(得分:26)

  

PARTIAL_STATE_SAVING应设为false吗?

当您遇到与您的网络应用中部分状态保存相关的常规缺陷时,实际上不会以其他方式解决/解决方法。部分状态保存在整体性能和内存使用方面具有主要优势。另请参阅Why JSF saves the state of UI components on server?

我无法100%可靠地为MyFaces发言,但在Mojarra中,当您绑定标记处理程序的任何属性时,将显示部分状态保存问题的根本原因(标记处理程序可以通过缺少{标记的{1}}属性(如JSTL标记)到视图范围的bean,或者当您将JSF组件的renderedid属性绑定到视图范围的bean时(这些属性)即在建立/恢复视图期间解决。)

此问题是由JSF issue 1492JSF spec issue 787中描述的鸡蛋问题引起的:启用了部分状态保存,视图范围的bean存储在部分视图状态中。因此,要提取视图范围的bean,必须还原部分视图状态。在恢复(构建)视图期间,将评估所有上述属性中的EL。但是,由于此时没有可用的视图范围bean实例,因此将创建一个全新的实例。但是,它将其所有属性设置为默认值!在恢复视图并恢复原始视图范围的bean之后,它们将被放回视图范围,覆盖在恢复视图期间创建的(临时)实例。但是这些属性的EL表达式已经基于完全不同的实例进行了评估,无法恢复。

通过在会话中存储视图范围的bean,Mojarra 2.1.18和2.2.0解决了这个鸡蛋问题。如果由于某种原因无法升级,那么通过将binding设置为javax.faces.PARTIAL_STATE_SAVING来禁用部分状态保存,确实可以解决这个问题。另一种方法是将将上述属性绑定到视图范围的bean,但寻找替代解决方案。

您也可以设置false。这允许您指定需要关闭部分状态保存的所有视图ID的逗号分隔列表:

javax.faces.FULL_STATE_SAVING_VIEW_IDS

这使您可以尽可能地从部分状态保存中受益,并且仅针对部分状态保存相关问题无法修复的视图子集关闭。

另见: