Ajax JSF2视图过期最奇怪的错误(更新-仅在将状态保存到服务器时发生)

Ajax JSF2视图过期最奇怪的错误(更新-仅在将状态保存到服务器时发生),ajax,jsf,jsf-2,Ajax,Jsf,Jsf 2,问题是- 我的JSF应用程序中有几个表单。 如果我在特定表单外激活AJAX调用20次或更多次,我会得到一个“找不到视图标识符的已保存视图状态”异常 更新1仅当状态保存在服务器上时才会发生此情况。设置此选项后,不会出现以下问题: <context-param> <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</descr

问题是- 我的JSF应用程序中有几个表单。 如果我在特定表单外激活AJAX调用20次或更多次,我会得到一个
“找不到视图标识符的已保存视图状态”
异常

更新1仅当状态保存在服务器上时才会发生此情况。设置此选项后,不会出现以下问题:

<context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>
还有一个更重要的因素,在每个时间点只有一个表单可见,其他表单有
显示:无
。 最后,所有bean都是会话范围的

现在,以下单击将导致异常(对于每一行,最后一次单击将导致异常)

  • Ax20,B
  • Ax19,B,C
  • Ax10,Cx10,B
  • Bx5、Cx5、Bx5、Cx5、A
  • 这不会导致异常:

  • Ax18,B,C,A
  • 换句话说,如果表单中的按钮在最近20次单击中未被单击,则下次单击时,将引发
    无保存视图状态
    异常。
    同一表单中的所有按钮都等同于表单,这意味着,如果
    表单A
    有按钮
    A1
    A2
    ,则以下按钮将导致异常:

  • A1x20,A2
  • A1x19,B,A2
  • A1,A2x20,B,A1

  • 有什么想法吗?!?这让我抓狂。

    您已经超过了会话中单个页面的浏览量限制。默认情况下,限制为15,但可通过
    web.xml
    中的上下文参数进行配置。从技术上讲,每个表单都是一个单独的视图,具有自己的视图状态。当您在不接触其他表单的情况下不断更新一个表单时,服务器端的视图状态将缓慢但肯定会过期

    在客户端保存视图状态确实可以解决这个问题,因为服务器端会话中不会存储任何内容。它只会使响应大小变大一点(带宽现在是多么便宜)

    如果希望将视图状态保留在服务器端,则还应
    呈现单个ajax表单中的其他表单,以便更新它们的视图状态:

    
    
    谢谢。考虑到您的解释,我决定采用客户端保存方法+会话压缩,这大大减少了会话大小。欢迎使用。如果表格不是特别大,这是一个很好的选择。你知道关于这个问题有什么好的读物吗?我找不到这方面的文档。不幸的是,找不到。这只是根据实际经验拼凑而成的信息,来自先前stackoverflow.com问题/答案和JSF2规范文档的片段。
    <h:form>
      <h:commandButton value="A">
        <f:ajax render="@form"/>
      <h:commandButton>
    <h:form>
    
    <h:form>
      <h:commandButton value="B">
        <f:ajax render="@form"/>
      <h:commandButton>
    <h:form>
    
    <h:form>
      <h:commandButton value="C">
        <f:ajax render="@form"/>
      <h:commandButton>
    <h:form>