10

在 JBoss 7.1.1 上的JSF2项目中,我们定义了一个会话超时,web.xml它工作得很好。

但是,有时我们会遇到视图过期,即使会话仍然存在,也会导致类似这样的错误:

javax.faces.application.ViewExpiredException: viewId:/... - View /... could 
not be restored.

我们可以在哪里设置视图超时,就像我们为会话所做的那样?还是视图过期是由其他原因引起的?

4

1 回答 1

15

另一个原因ViewExpiredException是会话中创建了太多的逻辑视图。默认限制是特定于 JSF 实现的,特定视图上的每个同步 GET 请求基本上都会创建一个新视图。因此,例如,当您使用 Mojarra(默认限制为 15)并启动浏览器会话并在 16 个不同选项卡中打开相同视图,然后在第一个选项卡中提交表单时,您也可能会遇到此异常. 该限制可使用 JSF 实现特定的上下文参数进行配置,该参数com.sun.faces.numberOfLogicalViews适用于 Mojarra 和org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSIONMyFaces(默认为 20)。

然而,这是一个非常罕见的现实世界问题。如果您的 web 应用程序确实设计为以这种方式使用(例如,邀请在多个选项卡中打开的社交/社区站点,例如讨论论坛或问答),那么您可能会考虑使用客户端状态保存来代替。

也可以看看:

于 2012-09-24T11:58:28.103 回答