会话使用JSF在Google App Engine中丢失

我已按照以下指示在我的Google App Engine应用程序中配置了JSF 2.1:

https://sites.google.com/a/wildstartech.com/adventures-in-java/Java-Platform-Enterprise-Edition/JavaServer-Faces/javaserver-faces-21/configuring-javaserver-faces-21-to-运行在最谷歌应用程序内,发动机采用月食

该应用程序在本地运行时运行良好,但在Google App Engine中部署会话时会丢失,例如:更新页面中的任何其他组件时组件值会丢失,并且SessionScope支持bean字段也会丢失。

我的web.xml文件是:

  JavaServerFaces  javax.faces.STATE_SAVING_METHOD client   javax.faces.DEFAULT_SUFFIX .xhtml   com.sun.faces.expressionFactory org.jboss.el.ExpressionFactoryImpl   com.sun.faces.enableThreading false   javax.faces.PROJECT_STAGE Production   javax.faces.FACELETS_SKIP_COMMENTS true   primefaces.UPLOADER commons   primefaces.THEME home    30    faces/home.xhtml    Faces Servlet javax.faces.webapp.FacesServlet 1   Faces Servlet /faces/* *.jsf *.xhtml    PrimeFaces FileUpload Filter org.primefaces.webapp.filter.FileUploadFilter  thresholdSize 2147483647    PrimeFaces FileUpload Filter Faces Servlet   javax.faces.application.ViewExpiredException /faces/home.xhtml    SystemServiceServlet com.google.api.server.spi.SystemServiceServlet  services     SystemServiceServlet /_ah/spi/*   

和appengine-web.xml文件:

    id 1  true     true   

JSF会话真的可以在Google App Engine中使用吗? 我错过了配置的东西吗?

先感谢您

这是一个常见问题。 您需要做的是强制会话序列化。 这可以通过执行以下操作来完成:

  • 创建阶段侦听器
  • 在每个阶段结束时,将随机属性存储到会话映射中
    • 例如sessionMap.put(“CURRENT_TIME”,System.currentTimeMillis())
  • 这将导致修改后的数据序列化到数据存储区

您需要执行此类操作的原因是,在构建视图树时,它已添加到会话中…然后您的业务逻辑对视图树中的组件进行了更改,但不幸的是对这些组件所做的更改变量不会引发任何通知GAE再次序列化的事件。 这就是为什么你会看到ViewExpiredExceptions或数据没有存储等等。

这个概念在本质上与您可能遇到过其他视图技术的markDirty()概念类似。

基于我对Harsha答案的理解,我发布了我用过的解决方案,以备其他人使用。

在GaeSession.java中:

 public class GaeSession implements PhaseListener { private static final long serialVersionUID = 1L; @Override public void afterPhase(PhaseEvent arg0) { FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("CURRENT_TIME", System.currentTimeMillis()); } @Override public void beforePhase(PhaseEvent arg0) { } @Override public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; } } 

在faces-config.xml中:

    package.GaeSession