Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 添加<;h:表格>;原因java.lang.IllegalStateException:在提交响应后无法创建会话_Forms_Session_Jsf_Jsf 2_Illegalstateexception - Fatal编程技术网

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配置/代码。缺点:当您想避免自己创建不必要的会话时

  • 在bean的(post)构造函数中使用
    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>