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得到解决。