java - 带有 GAE 和 ViewScoped ManagedBean 的 JSF2

标签 java google-app-engine jsf-2 primefaces

我设法用 JSF2 获得了一个原型(prototype),并在 Google AppEngine 中开始工作 tutorial .现在我对 ViewScoped ManagedBean 有一些奇怪的行为:

@ManagedBean @ViewScoped
public class TestBean implements Serializable
{
  private String text;         //getter/setter
  private List<String> texts;    //getter

  @PostConstruct public void init() 
  {
    texts = new ArrayList<String>();
    texts.add("Test");
    text = new String();
  }

  public void save(ActionEvent ae)
  {  
    texts.add(text);
    text = new String();
  }
}

这是我的 .xhtml 页面:

<h:body id="body">
  <f:view contentType="text/html">
     <h:form id="frm">
        <p:panel>  
            <h:panelGrid columns="2" id="grid">   
                <p:inputText value="#{testBean.text}"/>  
                <p:commandButton value="Add" update=":frm:op @parent"
                                actionListener="#{testBean.save}" />   
            </h:panelGrid>
        </p:panel>
        <p:outputPanel id="op">
           <p:dataTable var="v" value="#{testBean.texts}">  
              <p:column><h:outputText value="#{v}" /></p:column>
           </p:dataTable>
        </p:outputPanel>
     </h:form>
  </f:view>
</h:body>

这适用于本地部署(使用 GAE 的 Eclipse 工具),但如果我将其部署到 GAE,则单击添加按钮时没有任何反应。单击添加后,范围(在 GAE)的其他测试显示以下内容:

  • @RequestScoped : 输入的Text没有消失,没有添加到dataTable
  • @ViewScoped : 输入的Text没有消失,没有添加到dataTable
  • @SessionScoped : 输入的文本消失,数据表总是有两个条目:“测试”和最后输入的文本

我在教程中有相同的设置

<context-param>  //web.xml
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>server</param-value>
</context-param>

//appengine-web.xml
<sessions-enabled>true</sessions-enabled>

更新 1

以下是使用 @ManagedBean @ViewScoped 进行的额外测试的结果注释:

在第一次请求(或手动刷新页面)期间,@PostConstruct init()方法被调用。如果我点击按钮没有任何反应,请求到test.jsf已登录应用引擎日志,但我的 save() 中没有登录方法。 Firebug 向我显示了对 test.jsf 的 POST 请求以及以下答案:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response><error>
  <error-name>class javax.faces.application.ViewExpiredException</error-name>
  <error-message>
     <![CDATA[viewId:/test.jsf - View /test.jsf could not be restored.]]>
  </error-message>
  </error>
  <extension primefacesCallbackParam="validationFailed">
    {"validationFailed":false}
  </extension>
</partial-response>

更新 2

我用过 mojarra-2.0.4 但现在更新到 2.0.6。同样的问题,但有一个新的观察:如果我清除所有 Firefox 缓存,ViewExpiredException没有出现,但我只能将 1 个元素添加到 List<String> . @PostConstruct仅调用一次,而不是每次单击按钮时调用。

然后我尝试了 myfaces-2.0.7,但出现了这个异常:

Uncaught exception from servlet
java.lang.NoClassDefFoundError: Could not initialize class
com.google.apphosting.runtime.security.shared.stub.javax.naming.InitialContext

我不确定我是否应该尝试让 myfaces 工作,因为谷歌在他们的教程中明确提到了 mojarra (2.0.4)。

引用资料

最佳答案

通常我不会回答我的问题,我只会将此答案评为解决方法,而不是正确答案。 Event if I don't like client state saving,这似乎解决了奇怪的行为。但我必须详细检查一下:

<context-param>
  <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
  <param-value>client</param-value>
</context-param>

也许我们应该等到 JAVASERVERFACES-1886已解决。

关于java - 带有 GAE 和 ViewScoped ManagedBean 的 JSF2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7172335/

相关文章:

google-app-engine - 我可以在谷歌应用引擎上使用 node.js npm 和 socket.io

python - 在 google appengine 中基于 __key__ (唯一标识符)进行选择

jsf-2 - selectOneMenu 按各种列过滤,而不仅仅是标签

java - 谁知道 android 媒体播放器在 LogCat 中的 int 值?

java - 在 C++ 中使用 JNI 创建 JVM 不返回

java - 复制构造函数是否需要复制互斥体?

java - JSF - 使用 ajax 调用更改 panelGroup - Beans、EL 和?

java - 我的 Vector 丢失数据有什么原因吗?

python - 简单 channel API 相关测试因 1.8.2 升级而失败

java - 使用 f 转换时间时出现日期错误 :convertDateTime