Servlet.service () für Servlet jsp hat die Ausnahme java.lang.IllegalStateException ausgelöst

9

Ich habe einen Controller, der einen langen Polling-Mechanismus unter Verwendung von Springs DeferredResult verarbeitet. Manchmal, wenn ich die Controller-Methode mehrmals aufrufen, bekomme ich die folgende Ausnahme:

java.lang.IllegalStateException: getOutputStream() has already been called for this response

Also gibt es einen Aufruf views/getLongPollingGraphData , der einige IDs übergibt und mit einer JSON-Antwort für eine oder keine ID zurückkehrt. Wenn ich die Seite mehrere Male lade, was diesen URL-Aufruf einige Male verursacht, bekomme ich die obige Ausnahme.

Das Problem, mit dem ich konfrontiert bin, ist, dass ich den onCompletion -Rückruf an DeferredResult verwende, um DeferredResult aus einer Karte zu entfernen, wenn entweder das Zeitlimit überschritten wird oder die Antwort darauf gesetzt ist. Aber im Falle dieser Ausnahme wird onCompletion nicht aufgerufen und bleibt auf der Karte. Ich habe verschiedene So-Posts über diese Ausnahme gelesen, aber ich konnte mich auf keine von ihnen beziehen.

Unten ist der gesamte Stack-Trace der Ausnahme und Teile meiner Controller-Methode.

%Vor%

Controller-Methode:

%Vor%

Bearbeiten: Ich denke, dass ein org.apache.catalina.connector.ClientAbortException irgendwann ausgelöst wird, wenn die Seite kontinuierlich aktualisiert wird. Ich verwende org.springframework.web.servlet.handler.SimpleMappingExceptionResolver , um es in einer JSP-Seite zu behandeln. Unten ist der Code:

main-dispatcher-servlet.xml

%Vor%

ClientAbortException.jsp

%Vor%     
rd22 07.11.2016, 05:17
quelle

1 Antwort

2

Das Problem liegt auf der Hand:

Ссылка

  

Wirft:       IllegalStateException - wenn die Methode getReader () für diese Anfrage bereits aufgerufen wurde

Um herauszufinden, welcher Filter (oder etwas Ähnliches) die Methode getReader () vor Ihrem JSP-Servlet aufruft, legen Sie einen Unterbrechungspunkt auf IllegalStateException fest. Rufen Sie Ihre JSP an. Suchen Sie in der Aufrufliste Ihres Debuggers die spezifische Implementierungsklasse der Schnittstelle ServletRequest (dies ist containerspezifisch). Setzen Sie einen Unterbrechungspunkt auf getReader (), rufen Sie dann Ihre JSP erneut und Sie haben die Ursache.

Wenn Sie getReader () oder getInputStream () wirklich mehrmals aufrufen müssen, hilft Ihnen möglicherweise ein HttpServletRequestWrapper, siehe z. B .:

So lesen Sie InputStream mehrmals

Ссылка

Ohne Ihren gesamten Projektcode kann niemand den Grund für diese Ausnahme herausfinden.

    
quelle

Tags und Links