重新部署后,使用JSF 2防止ViewExpiredException

时间:2014-10-27 16:33:46

标签: java jsf tomcat primefaces jsf-2.2

我遇到问题,每次重新部署应用时,任何现有会话都会中断,请求会产生ViewExpiredException。相关问题或外部邮件列表/论坛帖子中的任何建议似乎都无法解决此问题。我可以完全重新部署相同的WAR文件,但行为是相同的。

我正在使用Apache MyFaces 2.2.0,Tomcat 7.0.56和Primefaces 5.0。

异常的消息是No saved view state could be found for the view identifier:,其中包含要求的任何页面。 Primefaces&#39; menubar用于导航,似乎是以带有POST请求的<form>实现的。这些消息与这些导航选项和使用POST的其他AJAX一起出现。

我试过了:

  1. 设置明确的org.apache.myfaces.SECRETorg.apache.myfaces.MAC_SECRET值,如in this document所示。
  2. client参数的serverjavax.faces.STATE_SAVING_METHOD值。
  3. 确保所有bean及其传递字段都是可序列化的。日志中未报告序列化错误。
  4. 使用过滤器添加无缓存标头,例如正如this answer中所述。
  5. 未禁用会话持久性,即我的context.xml<Manager pathname="" />已注释掉。

2 个答案:

答案 0 :(得分:0)

尝试:

<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true"/>

答案 1 :(得分:0)

似乎失去会话是一个&#34;功能&#34; Tomcat至少从版本6开始,并在通过WAR文件部署时继续到版本7。我们必须复制一个解压缩的目录以避免丢失会话,因为WAR更改会导致undeploy后跟deploy,而不是reload

bug report个州:

  

有一些方法可以在不删除会话的情况下实现应用程序的更新。最简单的可能是:
   - 部署为爆炸目录而不是WAR    - 更新文件
   - 触摸web.xml以触发重新加载

     

当前行为的原因是为了防止在以不兼容的方式更新WAR时出现问题,除了完全取消部署之后的任何其他内容(基本上)新部署都会导致冲突。

current Tomcat 7.0 documentation中的情况仍是如此:

  

目前,直接从WAR文件部署Web应用程序时,不支持应用程序重新加载(以获取对类或web.xml文件的更改)。它仅在从解压缩目录部署Web应用程序时才有效。