Hinzufügen von & lt; h: form & gt; causes java.lang.IllegalStateException: Nach dem Festschreiben der Antwort kann keine Sitzung erstellt werden
Ich stehe vor dem folgenden Ausnahme in einer sehr einfachen JSF-2 Seite nach dem hinzufügen <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)
Ich bin mit Mojarra 2.1.3 und PrimeFaces3.0M4, Tomcat 7.0.22 und JDK 7.
Die Seite ist eine sehr einfache Tabelle mit Daten:
<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>
Zeigt die Seite korrekt an den browser, sondern auf der Konsole sehe ich die Ausnahme. Die Ausnahme wird verschwinden, wenn ich entfernen Sie die <h:form>
.
Wie ist das verursacht und wie kann ich es lösen?
InformationsquelleAutor der Frage Pier Luigi | 2011-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein bekanntes problem und wurde berichtet von yours truly als Thema 2215. Dies wird auftreten, wenn die Antwort-Puffer ist übergelaufen (durch große Inhalte) und die Antwort ist begangen worden, bevor die Sitzung erstellt wurde. Dies ist das Ergebnis eines etwas übereifrigen versuche von Mojarra zu verschieben "unnötige" session-Erstellung so viel wie möglich (das ist seine eigene Gute Sache, obwohl).
Bis Sie es behoben, es gibt mehrere workarounds:
Erstellen Sie eine
Filter
die nichtHttpServletRequest#getSession()
vorFilterChain#doFilter()
. Vorteil: keine Umstellung der JSF-Konfiguration/code. Nachteil: wenn Sie möchten, vermeiden Sie unnötige Sitzung Schöpfung sich selbst als gut.Call
ExternalContext#getSession()
mittrue
im bean ' s (post) - Konstruktor oderpreRenderView
Zuhörer. Vorteil: eigentlich nichts. Nachteil: zu hacky.Fügen Sie einen context-parameter mit dem Namen des
com.sun.faces.writeStateAtFormEnd
und Wertfalse
zuweb.xml
. Vorteil: unnötige session-Erzeugung wird wirklich vermieden, im Gegensatz zu #1 und #2. Nachteil: die Antwort wird nun komplett im Speicher gepuffert, bis</h:form>
erreicht ist. Wenn Ihre Formen sind nicht extrem groß, die Auswirkungen dürften jedoch gering sein. Es würde jedoch immer noch nicht, wenn Ihre<h:form>
beginnt relativ spät in den Blick. Dies kann kombiniert werden mit #4.Fügen Sie einen context-parameter mit dem Namen des
javax.faces.FACELETS_BUFFER_SIZE
und den Wert der Facelets-response-Puffer-Größe in bytes (z.B.65535
64KB), so dass die gesamte HTML-Ausgabe oder zumindest die<h:form>
(siehe #3) passt in den response-Puffer. Vorteil/Nachteil, siehe #3.Fügen Sie einen context-parameter mit dem Namen des
javax.faces.STATE_SAVING_METHOD
und Wertclient
zuweb.xml
. Vorteil: die session wird nicht erstellt, wenn Sie session-scoped beans. Es auch sofort löst PotenzialViewExpiredException
Fällen. Nachteil: die erhöhte Nutzung der Netzwerk-Bandbreite. Wenn Sie mit den partial-state-saving, dann sollte die Auswirkung jedoch gering sein.Warum das problem verschwindet, wenn Sie entfernen
<h:form>
ist dies, weil keine Sitzung erstellt werden muss, um zum speichern des Anzeigestatus.Update: diese hat wie pro die doppelte Problem 2277 behoben wurde, da Mojarra 2.1.8. So können Sie auch nur ein upgrade auf mindestens version.
InformationsquelleAutor der Antwort BalusC
Mit der neuen version 2.1.21 gestern veröffentlicht von javax.Gesichter dieses problem scheint verschwunden zu sein.
Deklarieren Sie die neue version:
und ersetzen Sie die javax.faces.jar in der glassfish-Ordner Module ersetzen die javax.faces.jar für die neue version 2.1.21.
InformationsquelleAutor der Antwort Gaspar Kuhnen
In meinem Fall (myfaces-2.2.8 & Tomcat 8.0.23) das Problem war ein Tippfehler in der
welcome-file
vonweb.xml
.Beim Debuggen habe ich gesehen, dass Tomcat erzeugt wie erwartet einen 404, aber irgendwie myfaces Zugriff versucht danach die Sitzung, die verursacht dann eine
java.lang.IllegalStateException: Cannot create a session after the response has been committed
.Mit einer gültigen Seite in
welcome-file
vonweb.xml
behoben das Problem für mich.InformationsquelleAutor der Antwort hinneLinks
Müssen Sie eine
<f:view>
und</f:view>
vor und nachh:form
Elemente, plus fügen Sie den link zu Ihrer html-tag für die jsf-tagsfür diese zu arbeiten.
InformationsquelleAutor der Antwort joeblow
Wenn du mit Spring MVC und der Aufruf erfolgt durch Feder-Formen, dann sollten wir verwenden die Methode GET statt POST(Holen von Daten) und es sollte kein input-Feld, das wir verwenden können, intead.
InformationsquelleAutor der Antwort user2645432