47

追加した後、非常に単純なJSF2ページで次の例外に直面しています<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)

Tomcat7.0.22およびJDK7でMojarra2.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>ます。

これはどのように発生し、どうすれば解決できますか?

4

5 に答える 5

83

これは既知の問題であり、問​​題2215として実際に報告されています。これは、応答バッファがオーバーフローし(コンテンツが大きいため)、セッションが作成される前に応答がコミットされた場合に発生します。これは、「不必要な」セッションの作成を可能な限り延期しようとするMojarraの少し熱心な試みの結果です(それ自体は良いことですが)。

彼らがそれを修正するまで、いくつかの回避策があります:

  1. 前に行うFilterを作成します。利点:JSF構成/コードを変更する必要はありません。短所:不必要なセッションの作成も自分で避けたい場合。HttpServletRequest#getSession()FilterChain#doFilter()

  2. Beanの(ポスト)コンストラクターまたはリスナーExternalContext#getSession()で呼び出します。利点:実際には何もありません。短所:ハッキーすぎる。truepreRenderView

  3. com.sun.faces.writeStateAtFormEnd名前と値がfalsetoのコンテキストパラメータを追加しますweb.xml。利点:#1と#2とは対照的に、不要なセッションの作成が実際に回避されます。短所:応答は、に達するまでメモリに完全にバッファリングされるように</h:form>なりました。ただし、フォームが極端に大きくない場合、影響は最小限に抑えられます。<h:form>ただし、ビューの比較的遅い位置から開始した場合でも失敗します。これは#4と組み合わせることができます。

  4. HTML出力全体または少なくとも(#3を参照)が応答バッファーに収まるようjavax.faces.FACELETS_BUFFER_SIZEに、Facelets応答バッファーサイズの名前と値(64KBなど)を含むコンテキストパラメーターを追加します。長所/短所、#3を参照してください。65535<h:form>

  5. javax.faces.STATE_SAVING_METHOD名前と値がclienttoのコンテキストパラメータを追加しますweb.xml。利点:セッションスコープのBeanがない限り、セッションはまったく作成されません。また、潜在的なViewExpiredExceptionケースを即座に解決します。短所:ネットワーク帯域幅の使用量が増加します。ただし、部分的な状態保存を使用している場合、影響は最小限に抑えられます。

を削除すると問題が解消される理由は<h:form>、ビューステートを保存するためにセッションを作成する必要がないためです。


更新:これは、重複する問題2277に従って、 Mojarra2.1.8以降で修正されています。したがって、少なくともそのバージョンにアップグレードすることもできます。

于 2011-11-09T22:09:14.837 に答える
6

昨日リリースされた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のja​​vax.faces.jarを置き換えます。

于 2013-04-10T15:10:59.763 に答える
3

私の場合(myfaces-2.2.8&Tomcat 8.0.23)、問題はのタイプミスwelcome-fileでしたweb.xml。私が見たデバッグ中に、Tomcatは期待どおりに404を作成しましたが、どういうわけかmyfacesがセッションの後でアクセスしようとしたため、が発生しましたjava.lang.IllegalStateException: Cannot create a session after the response has been committed。の有効なページを使用すると、問題welcome-fileweb.xml修正されました。

于 2015-07-29T11:48:23.813 に答える
0

<f:view>要素の</f:view> 前後に追加する必要がある場合がありますh:form。さらに、jsfタグのhtmlタグへのリンクを追加する必要があります。

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

これが機能するために。

于 2017-06-16T20:19:58.667 に答える
-1

Spring MVCを使用していて、呼び出しがSpring Formsによって行われる場合は、POST(データをフェッチするため)の代わりにGETメソッドを使用する必要があり、代わりに使用できる入力フィールドがないはずです。

于 2015-02-12T07:30:09.200 に答える