Pie*_*igi 47 forms session jsf jsf-2 illegalstateexception
添加后,我在一个非常简单的JSF 2页面中面临以下异常<h:form>:
java.lang.IllegalStateException: Cannot create a session after the response has been committed
at org.apache.catalina.connector.Request.doGetSession(Request.java:2758)
at org.apache.catalina.connector.Request.getSession(Request.java:2268)
Run Code Online (Sandbox Code Playgroud)
我在Tomcat 7.0.22和JDK 7上使用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>
Run Code Online (Sandbox Code Playgroud)
页面在浏览器上正确显示,但在控制台上我看到了异常.如果我删除了,Exception确实会消失<h:form>.
这是怎么造成的,我该如何解决?
Bal*_*usC 83
这是一个已知问题,您的确已将其作为问题2215报告过.当响应缓冲区溢出(由于内容较大)并且在创建会话之前已提交响应时,将发生这种情况.这是Mojarra尽可能推迟"不必要的"会话创建的过度尝试的结果(尽管这本身就是一件好事).
在他们修复之前,有几种解决方法:
创建Filter这不HttpServletRequest#getSession()前FilterChain#doFilter().优点:无需更改JSF配置/代码.缺点:当你想要避免不必要的会话创建时.
打电话ExternalContext#getSession()与true在bean的(后)构造函数或preRenderView监听.优势:实际上,没有.缺点:太hacky.
添加名称为com.sun.faces.writeStateAtFormEnd和值为falseto 的上下文参数web.xml.优点:与#1和#2相反,将真正避免不必要的会话创建.缺点:响应现在将在内存中完全缓冲,直到</h:form>达到.如果您的表格不是很大,那么影响应该是最小的.但是如果你<h:form>在视图中相对较晚开始,它仍然会失败.这可以与#4结合使用.
添加一个上下文参数,其名称为javax.faces.FACELETS_BUFFER_SIZE和Facelets响应缓冲区大小的值(以字节65535为单位)(例如64KB),以便整个HTML输出或至少<h:form>(参见#3)适合响应缓冲区.优点/缺点,见#3.
添加名称为javax.faces.STATE_SAVING_METHOD和值为clientto 的上下文参数web.xml.优点:除非您有会话范围的bean,否则将不会创建会话.它还可以立即解决潜在的ViewExpiredException案例.缺点:增加了网络带宽使用率.如果您正在使用部分状态保存,那么影响应该是最小的.
至于移除时问题消失的原因<h:form>,这是因为不需要创建会话来存储视图状态.
更新:根据重复问题2277,自Mojarra 2.1.8以来已修复.所以,你也可以升级到至少那个版本.
小智 6
随着昨天发布的javax.faces新版本2.1.21,这个问题似乎已经消失了.声明新版本:
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.1.21</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
并替换glassfish模块文件夹中的javax.faces.jar,替换新版本2.1.21的javax.faces.jar.