添加后,我在一个非常简单的 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)
我在 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>
该页面在浏览器上正确显示,但在控制台上我看到异常。如果我删除,异常就会消失<h:form>
.
这是如何引起的以及如何解决?
这是一个已知问题,您已将其真实报告为第2215期 http://java.net/jira/browse/JAVASERVERFACES-2215。当响应缓冲区溢出(由于内容较大)并且在创建会话之前提交响应时,就会发生这种情况。这是 Mojarra 过于热心地尝试尽可能推迟“不必要的”会话创建的结果(尽管这本身就是一件好事)。
在他们解决问题之前,有几种解决方法:
创建一个Filter
这确实HttpServletRequest#getSession() http://download.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getSession%28%29 before FilterChain#doFilter() http://download.oracle.com/javaee/6/api/javax/servlet/FilterChain.html#doFilter%28javax.servlet.ServletRequest,%20javax.servlet.ServletResponse%29。优点:无需更改 JSF 配置/代码。缺点:当您也想避免自己创建不必要的会话时。
Call ExternalContext#getSession() http://download.oracle.com/javaee/6/api/javax/faces/context/ExternalContext.html#getSession%28boolean%29 with true
在 bean 的(后)构造函数中或者preRenderView
听众。优点:其实没什么。缺点:太老套了。
添加名称为的上下文参数com.sun.faces.writeStateAtFormEnd
和价值false
to 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
和价值client
to web.xml
。优点:除非您有会话范围的 bean,否则根本不会创建会话。它还可以立即解决潜在问题ViewExpiredException
案例。缺点:增加网络带宽使用。如果您使用部分状态保存,那么影响应该很小。
至于为什么删除后问题就消失了<h:form>
,这是因为不需要创建会话来存储视图状态。
Update:这与副本相同第2277期 http://java.net/jira/browse/JAVASERVERFACES-2277自 Mojarra 2.1.8 以来已修复。因此,您也可以至少升级到该版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)