web-dev-qa-db-de.com

java.lang.IllegalStateException: Kann nicht (Weiterleiten | sendRedirect | Sitzung erstellen) erstellt werden, nachdem die Antwort übernommen wurde

Diese Methode wirft 

Java.lang.IllegalStateException: Kann nicht weitergeleitet werden, nachdem die Antwort festgeschrieben wurde

und ich kann das Problem nicht erkennen. Irgendeine Hilfe?

    int noOfRows = Integer.parseInt(request.getParameter("noOfRows"));
    String chkboxVal = "";
    // String FormatId=null;
    Vector vRow = new Vector();
    Vector vRow1 = new Vector();
    String GroupId = "";
    String GroupDesc = "";
    for (int i = 0; i < noOfRows; i++) {
        if ((request.getParameter("chk_select" + i)) == null) {
            chkboxVal = "notticked";
        } else {
            chkboxVal = request.getParameter("chk_select" + i);
            if (chkboxVal.equals("ticked")) {
                fwdurl = "true";
                Statement st1 = con.createStatement();
                GroupId = request.getParameter("GroupId" + i);
                GroupDesc = request.getParameter("GroupDesc" + i);
                ResultSet rs1 = st1
                        .executeQuery("select FileId,Description from cs2k_Files "
                                + " where FileId like 'M%' and co_code = "
                                + ccode);
                ResultSetMetaData rsm = rs1.getMetaData();
                int cCount = rsm.getColumnCount();

                while (rs1.next()) {
                    Vector vCol1 = new Vector();
                    for (int j = 1; j <= cCount; j++) {
                        vCol1.addElement(rs1.getObject(j));
                    }
                    vRow.addElement(vCol1);
                }
                rs1 = st1
                        .executeQuery("select FileId,NotAllowed from cs2kGroupSub "
                                + " where FileId like 'M%' and GroupId = '"
                                + GroupId + "'" + " and co_code = " + ccode);
                rsm = rs1.getMetaData();
                cCount = rsm.getColumnCount();

                while (rs1.next()) {
                    Vector vCol2 = new Vector();
                    for (int j = 1; j <= cCount; j++) {
                        vCol2.addElement(rs1.getObject(j));
                    }
                    vRow1.addElement(vCol2);
                }

                // throw new Exception("test");

                break;
            }
        }
    }
    if (fwdurl.equals("true")) {
        // throw new Exception("test");
        // response.sendRedirect("cs2k_GroupCopiedUpdt.jsp") ;
        request.setAttribute("GroupId", GroupId);
        request.setAttribute("GroupDesc", GroupDesc);
        request.setAttribute("vRow", vRow);
        request.setAttribute("vRow1", vRow1);
        getServletConfig().getServletContext().getRequestDispatcher(
                "/GroupCopiedUpdt.jsp").forward(request, response);
    }
84
sansknwoledge

Ein häufiges Missverständnis unter Startern besteht darin, dass sie der Meinung sind, dass der Aufruf einer forward(), sendRedirect() oder sendError() auf magische Weise aus dem Methodenblock austreten und aus dem Methodenblock "springen" würde, wodurch der Rest des Codes ignoriert wird. Zum Beispiel:

protected void doPost() {
    if (someCondition) {
        sendRedirect();
    }
    forward(); // This is STILL invoked when someCondition is true!
}

Das stimmt also eigentlich nicht. Sie verhalten sich sicherlich nicht anders als andere Java-Methoden (natürlich von System#exit()). Wenn someCondition in obigem Beispiel true ist und Sie somit forward() nach sendRedirect() oder sendError() für dieselbe Anfrage/Antwort aufrufen, besteht die Chance, dass big die Ausnahme ist:

Java.lang.IllegalStateException: Kann nicht weitergeleitet werden, nachdem die Antwort festgeschrieben wurde

Wenn die if-Anweisung eine forward() aufruft und Sie anschließend sendRedirect() oder sendError() aufrufen, wird die folgende Ausnahme ausgelöst:

Java.lang.IllegalStateException: sendRedirect () kann nicht aufgerufen werden, nachdem die Antwort festgeschrieben wurde

Um dies zu beheben, müssen Sie entweder eine return;-Anweisung hinzufügen

protected void doPost() {
    if (someCondition) {
        sendRedirect();
        return;
    }
    forward();
}

... oder einen anderen Block einführen.

protected void doPost() {
    if (someCondition) {
        sendRedirect();
    } else {
        forward();
    }
}

Um die Hauptursache in Ihrem Code nicht zu ermitteln, suchen Sie nach einer beliebigen Zeile, die eine forward(), sendRedirect() oder sendError() aufruft, ohne den Methodenblock zu verlassen oder den Rest des Codes zu überspringen. Dies kann innerhalb desselben Servlets vor der jeweiligen Codezeile sein, aber auch in einem Servlet oder Filter, das vor dem bestimmten Servlet aufgerufen wurde.

Im Falle von sendError() verwenden Sie stattdessen setStatus(), wenn Sie lediglich den Antwortstatus festlegen möchten.


Eine andere wahrscheinliche Ursache ist, dass das Servlet in die Antwort schreibt, während eine forward() aufgerufen wird oder in derselben Methode aufgerufen wurde.

protected void doPost() {
    out.write("some string");
    // ... 
    forward(); // Fail!
}

Die Antwortpuffergröße ist auf den meisten Servern standardmäßig auf 2 KB eingestellt. Wenn Sie also mehr als 2 KB in den Server schreiben, wird er festgeschrieben, und forward() schlägt auf dieselbe Weise fehl:

Java.lang.IllegalStateException: Kann nicht weitergeleitet werden, nachdem die Antwort festgeschrieben wurde

Die Lösung liegt auf der Hand. Schreiben Sie nicht auf die Antwort im Servlet. Das ist die Verantwortung der JSP. Sie setzen einfach ein Anforderungsattribut wie request.setAttribute("data", "some string") und drucken es dann in JSP wie ${data} aus. Siehe auch unsere Servlets-Wiki-Seite , um zu erfahren, wie Servlets richtig verwendet werden.

Siehe auch:


Nicht mit Ihrem konkreten Problem verwandt, verliert Ihr JDBC-Code Ressourcen. Reparieren Sie das auch. Hinweise finden Sie auch unter Wie oft sollten Connection, Statement und ResultSet in JDBC geschlossen werden?

218
BalusC

wenn Sie sogar eine return-Anweisung hinzufügen, wird diese Ausnahme ausgelöst, deren einzige Lösung dieser Code ist:

if(!response.isCommitted())
// Place another redirection
19
user1503117

Normalerweise wird dieser Fehler angezeigt, nachdem Sie bereits eine Umleitung durchgeführt haben und dann versuchen, weitere Daten an den Ausgabestream auszugeben. In den Fällen, in denen ich dies in der Vergangenheit gesehen habe, ist es oft einer der Filter, der versucht, die Seite umzuleiten und dann immer noch zum Servlet weiterzuleiten. Ich kann nichts direkt mit dem Servlet sehen, daher sollten Sie sich auch die Filter ansehen, die Sie bereits installiert haben.

Bearbeiten: Weitere Hilfe bei der Diagnose des Problems…

Der erste Schritt zur Diagnose dieses Problems besteht darin, festzustellen, wo genau die Ausnahme ausgelöst wird. Wir gehen davon aus, dass es von der Leitung geworfen wird

getServletConfig().getServletContext()
                  .getRequestDispatcher("/GroupCopiedUpdt.jsp")
                  .forward(request, response);

Möglicherweise stellen Sie jedoch fest, dass es später im Code geworfen wird, wo Sie versuchen, in den Ausgabestream auszugeben, nachdem Sie versucht haben, den Forward auszuführen. Wenn es von der obigen Zeile kommt, bedeutet dies, dass Sie vor dieser Zeile entweder Folgendes haben:

  1. ausgabedaten in den Ausgabestrom oder
  2. zuvor eine weitere Umleitung durchgeführt.

Viel Glück! 

6
Paul Wagland

Dies liegt daran, dass Ihr Servlet versucht, auf ein Anforderungsobjekt zuzugreifen, das nicht mehr vorhanden ist ... __ Die Forward- oder Include-Anweisung eines Servlets stoppt die Ausführung des Methodenblocks nicht. Sie wird wie jede andere Java-Methode bis zum Ende des Methodenblocks oder der ersten Return-Anweisung fortgesetzt.

Um dieses Problem am besten zu lösen, legen Sie die Seite (von der aus Sie die Anforderung weiterleiten möchten) dynamisch gemäß Ihrer Logik fest. Das ist:

protected void doPost(request , response){
String returnPage="default.jsp";
if(condition1){
 returnPage="page1.jsp";
}
if(condition2){
   returnPage="page2.jsp";
}
request.getRequestDispatcher(returnPage).forward(request,response); //at last line
}

und vorwärts nur einmal in der letzten Zeile machen ...

sie können dieses Problem auch mit der return-Anweisung nach jedem forward () beheben oder jeden forward () in den if ... else-Block einfügen

2
Suman Sengupta

Ich entfernte 

        super.service(req, res);

Dann hat es gut für mich funktioniert

2
Kartik_Agarwal

Stoßen...

Ich hatte gerade den gleichen Fehler. Ich habe festgestellt, dass ich super.doPost(request, response); aufgerufen habe, als ich die doPost()-Methode überschrieb und den Superklassenkonstruktor explizit aufrief 

    public ScheduleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

Sobald ich die super.doPost(request, response); aus der doPost()-Anweisung heraus kommentiert habe, hat es perfekt funktioniert ...

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //super.doPost(request, response);
        // More code here...

}

Es ist unnötig zu erwähnen, dass ich die bewährten Methoden von super() noch einmal durchlesen muss

2
John Rambo

Nach der Return-Forward-Methode können Sie dies einfach tun:

return null;

Es wird den aktuellen Bereich durchbrechen.

0
Amir Amiri

Sie sollten return statement hinzufügen, während Sie den Fluss weiterleiten oder umleiten.

Beispiel: 

wenn vorwärts,

    request.getRequestDispatcher("/abs.jsp").forward(request, response);
    return;

wenn umleiten,

    response.sendRedirect(roundTripURI);
    return;
0
Ashish Mishra