JSF2与GAE和ViewScoped ManagedBean

在本教程之后,我设法使用JSF2获取原型并在Googles AppEngine上工作。 现在我对ViewScoped ManagedBean有一些奇怪的行为:

@ManagedBean @ViewScoped public class TestBean implements Serializable { private String text; //getter/setter private List texts; //getter @PostConstruct public void init() { texts = new ArrayList(); texts.add("Test"); text = new String(); } public void save(ActionEvent ae) { texts.add(text); text = new String(); } } 

这是我的.xhtml页面:

    

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

  • @RequestScoped :输入的文本不会消失,也不会添加到dataTable中
  • @ViewScoped :输入的文本不会消失,也不会添加到dataTable中
  • @SessionScoped :输入的文本消失,dataTable总是有两个条目:“Test”和最后输入的Text

我从教程中得到了相同的设置

  //web.xml javax.faces.STATE_SAVING_METHOD server  //appengine-web.xml true 

更新1

以下是使用@ManagedBean @ViewScoped注释的其他测试的结果:

在第一个请求(或手动刷新页面)期间,调用@PostConstruct init()方法。 如果我点击按钮没有发生任何事情 ,则在app引擎日志中记录对test.jsf的请求,但我的save()方法中没有日志。 Firebug向我展示了对test.jsf的POST请求和以下答案:

   class javax.faces.application.ViewExpiredException      {"validationFailed":false}   

更新2

我使用过mojarra-2.0.4但现在更新到2.0.6。 同样的问题,但一个新的观察:如果我清除所有Firefox缓存, ViewExpiredException没有出现,但我只能将1个元素添加到List@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)。

参考

  • GAE上的ViewExpiredException
  • JIRA JAVASERVERFACES-1886

通常我不回答我的问题,我只是将这个答案评为解决方法而不是正确的答案。 事件,如果我不喜欢客户端状态保存,这似乎解决了奇怪的行为。 但我必须详细检查:

  javax.faces.STATE_SAVING_METHOD client  

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