Forms 添加<;h:表格>;原因java.lang.IllegalStateException:在提交响应后无法创建会话
在添加Forms 添加<;h:表格>;原因java.lang.IllegalStateException:在提交响应后无法创建会话,forms,session,jsf,jsf-2,illegalstateexception,Forms,Session,Jsf,Jsf 2,Illegalstateexception,在添加之后,我在一个非常简单的JSF2页面中遇到了以下异常: 我在Tomcat7.0.22和JDK7上使用Mojarra 2.1.3和PrimeFaces3.0M4 该页面是一个非常基本的数据表: <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http:/
之后,我在一个非常简单的JSF2页面中遇到了以下异常:
我在Tomcat7.0.22和JDK7上使用Mojarra 2.1.3和PrimeFaces3.0M4
该页面是一个非常基本的数据表:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
<h:form>
<p:dataTable var="car" value="#{tableBean.cars}">
......
</p:dataTable>
</h:form>
</h:body>
</html>
......
页面在浏览器上显示正确,但在控制台上我看到异常。如果我删除
,异常将消失
这是如何造成的,我如何解决它?这是一个已知的问题,您的报告称为。当响应缓冲区溢出(由于内容太大)并且在创建会话之前提交响应时,就会发生这种情况。这是Mojarra过于热心地试图尽可能推迟“不必要的”会话创建的结果(尽管这本身是一件好事) 在他们修复之前,有几个解决办法:
过滤器
,该过滤器在之前执行。优点:无需更改JSF配置/代码。缺点:当您想避免自己创建不必要的会话时true
或preRenderView
侦听器调用。优点:事实上,没什么。缺点:太粗糙com.sun.faces.writestateformend
且值为false
的上下文参数添加到web.xml
。优点:与#1和#2相比,可以真正避免不必要的会话创建。缺点:响应现在将在内存中完全缓冲,直到达到
。如果表单不是非常大,那么影响应该是最小的。但是,如果您的
在视图中相对较晚地启动,则仍然会失败。这可能与#4相结合javax.faces.FACELETS_BUFFER_SIZE
的上下文参数和一个以字节为单位的FACELETS响应缓冲区大小值(例如64KB的65535
),以便整个HTML输出或至少
(请参见#3)适合响应缓冲区。优势/劣势,见第3页javax.faces.STATE\u SAVING\u METHOD
和值为client
的上下文参数添加到web.xml
。优点:除非您有会话范围的bean,否则根本不会创建会话。它还可以立即解决潜在的ViewExpiredException
情况。缺点:网络带宽使用率增加。如果您使用的是部分状态保存,那么影响应该是最小的
时问题消失的原因,这是因为不需要创建会话来存储视图状态
更新:自Mojarra 2.1.8以来,已根据副本修复此问题。因此,您也可以升级到至少该版本。昨天发布的javax.faces的新版本2.1.21,这个问题似乎已经消失了。 声明新版本:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.21</version>
</dependency>
玻璃鱼
javax.faces
2.1.21
并替换glassfish模块文件夹中的javax.faces.jar,替换新版本2.1.21的javax.faces.jar。如果您使用的是Spring MVC,并且调用是由Spring表单进行的,那么我们应该使用GET方法而不是POST(获取数据),并且应该没有可以使用intead的输入字段。在我的例子中(myfaces-2.2.8和Tomcat 8.0.23)问题是
web.xml
的欢迎文件中有一个打字错误。
调试时,我看到Tomcat按预期创建了404,但不知何故myfaces试图在会话之后访问,这导致了java.lang.IllegalStateException:在提交响应后无法创建会话
。
在web.xml的welcome file
中使用有效页面解决了我的问题。您可能需要在h:form
元素之前和之后添加
和
,并添加指向jsf标记的html标记的链接
感谢!似乎这个问题将通过Mojarra 2.1.8()解决,Mojarra 2.1.8()应该在整个JIRA发布。这个问题似乎仍然存在,2.1.16我有一个类似的问题,当我使用2.1.13时,这个问题已经存在。但是,实施#3建议解决了它。
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.21</version>
</dependency>