Java 带有GAE和ViewScope ManagedBean的JSF2
我成功地获得了一个JSF2原型,并随后在谷歌AppEngine工作。现在,我对ViewScope ManagedBean有一些奇怪的行为:Java 带有GAE和ViewScope ManagedBean的JSF2,java,google-app-engine,jsf-2,primefaces,Java,Google App Engine,Jsf 2,Primefaces,我成功地获得了一个JSF2原型,并随后在谷歌AppEngine工作。现在,我对ViewScope ManagedBean有一些奇怪的行为: @ManagedBean @ViewScoped public class TestBean implements Serializable { private String text; //getter/setter private List<String> texts; //getter @PostCons
@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();
}
}
更新1
以下是使用@ManagedBean@ViewScoped
注释进行附加测试的结果:
在第一个请求(或页面的手动引用)期间,调用@PostConstruct init()
方法。如果我单击按钮,什么也没有发生,那么对test.jsf
的请求将记录在app engines日志中,但在我的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>
我不确定是否应该尝试让myfaces正常工作,因为google在教程中明确提到了mojarra(2.0.4)
参考资料
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
javax.faces.STATE_保存方法
客户
也许我们应该等到问题得到解决。你能不能从开发人员的角度而不是从最终用户的角度详细说明“什么都没发生”的问题?像Firebug这样的HTTP流量调试器会说什么?是否发送ajax POST请求?究竟返回了什么样的响应?bean的操作方法是否被调用?setter是否被调用?bean不是不必要地(post)根据来自同一视图的每个请求构建吗?等等。打开调试器或进行穷人的调试,在战略位置插入一堆
System.out.println()
行,打印感兴趣的信息和/或变量。亲爱的BalusC,你完全正确。我将添加调试信息。感谢您指出这一点(并记住我的Firebug)!哈,你有一个ViewExpiredException
。总而言之,这很好。下一个问题,你用的是MyFaces还是Mojara?什么版本?我记得以前在GAE上的MyFaces的某个版本上见过这种问题。无论如何,请尝试将JSF impl/version升级到GAE支持的最新版本。Servlet2.5容器的当前版本为2.0.6,Servlet3.0容器的当前版本为2.1.2(我不做GAE,但我认为它仍然支持MaxServlet2.5)。分别位于2.0.7和2.1.1。我发现了一个类似的SO问题:
<?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>
Uncaught exception from servlet
java.lang.NoClassDefFoundError: Could not initialize class
com.google.apphosting.runtime.security.shared.stub.javax.naming.InitialContext
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>