2011-11-09 39 views
46

我在添加<h:form>之後在一個非常簡單的JSF 2頁面中遇到以下異常:添加<h:form>會導致java.lang.IllegalStateException:在提交響應後無法創建會話

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>,Exception確實會消失。

這是如何引起的,我該如何解決?

回答

82

這是一個已知的問題,並已真實報告爲issue 2215。當響應緩衝區已經溢出(由於內容較大)並且在創建會話之前已提交響應時,會發生這種情況。這是Mojarra試圖儘可能地推遲「不必要的」會話創建的過分努力的結果(儘管它本身就是一件好事)。

,直到他們得到它固定的,有幾種解決方法:

  1. 創建FilterFilterChain#doFilter()之前其確實HttpServletRequest#getSession()。優點:無需更改JSF配置/代碼。缺點:當你想避免不必要的會話創建。

  2. 撥打ExternalContext#getSession()true在bean的(後)構造函數或preRenderView偵聽器。優點:實際上,沒有。缺點:太hacky。

  3. 添加名稱爲com.sun.faces.writeStateAtFormEnd且值爲falseweb.xml的上下文參數。優勢:與#1和#2相反,不必要的會話創建將被真正避免。缺點:響應現在將完全緩衝在內存中,直到達到</h:form>。如果你的表格不是特別大,那麼影響應該是最小的。但是,如果您的<h:form>在相對較晚時間開始,它仍然會失敗。這可能與#4結合。

  4. 添加與javax.faces.FACELETS_BUFFER_SIZE名稱的上下文參數,並且所述的Facelets響應緩衝區大小的以字節爲單位(65535爲64KB例如)的值,使得整個HTML輸出或至少<h:form>(參見#3)裝配在響應緩衝。優點/缺點,請參閱#3。

  5. 添加名稱爲javax.faces.STATE_SAVING_METHOD且值爲clientweb.xml的上下文參數。優點:除非你有會話範圍的bean,否則根本不會創建會話。它也立即解決潛在的ViewExpiredException案件。缺點:增加網絡帶寬使用量。如果您使用部分狀態保存,那麼影響應該是最小的。

至於爲什麼當你刪除<h:form>問題消失,這是因爲沒有會話需要,以便存儲視圖狀態下創建。


更新:這有按自鑽嘴魚科2.1.8重複issue 2277得到修復。所以,你也可以升級到至少那個版本。

+1

的感謝! 看來這個問題將鑽嘴魚科2.1.8(http://java.net/jira/browse/JAVASERVERFACES-2277),我們會盡快公佈 – wemu

+1

貫穿整個JIRA閱讀似乎問題仍然躺在附近得到解決,2.1.16 –

+0

我有一個類似的問題,而當我使用2.1.13時,問題就出現了。然而,實施#3建議解決了它。 –

5

隨着javax.faces的昨天發佈此問題的新版本2.1.21似乎已經消失。 聲明新版本:

<dependency> 
    <groupId>org.glassfish</groupId> 
    <artifactId>javax.faces</artifactId> 
    <version>2.1.21</version> 
</dependency> 

,並在GlassFish模塊文件夾更換javax.faces.jar新版本2.1.21更換javax.faces.jar。

-1

如果你正在使用Spring MVC和調用是由彈簧形成做出那麼我們應該使用GET方法而不是POST(獲取數據),而且應該是我們可以使用這一翻譯沒有輸入字段。

+0

<形式:形式方法= 「GET」 \t \t \t \t \t行動= 「#」 \t \t \t \t \t ID = 「viewAllHospital」 類= 「validateForm」 \t \t \t \t \t的ModelAttribute = 「hccHospitalUserInfoForm」> \t \t \t \t \t \t View All Hospitals \t \t \t \t \t – user2645432

2

在我的情況下(myfaces-2.2.8 & Tomcat 8.0.23)問題是welcome-fileweb.xml中的拼寫錯誤。 在調試我一看,是Tomcat的創建爲預期404,但不知何故MyFaces的嘗試就可以訪問會話,這引起了那麼java.lang.IllegalStateException: Cannot create a session after the response has been committed。 在web.xmlwelcome-file使用有效頁解決了這一問題對我來說。

0

您可能需要前後h:form元素添加一個<f:view></f:view>,再加上鍊接添加到您的HTML標記的JSF標籤

<html xmlns:f="http://java.sun.com/jsf/core"> 

這個工作。

相關問題