2016-06-24 3 views
1

Ich versuche, eine Transaktion pro Anfrage in meiner Spring-Boot-Anwendung zu implementieren. Ich habe einen Filter mit HIGHEST_PRECEDENCE Reihenfolge, der eine Transaktion öffnet, lässt andere Filter und die Dienste der App ihre Arbeit machen und die Transaktion festlegt. Wenn jedoch die Übertragung fehlschlägt, die Servlet-Antwort bereits geschrieben und festgeschrieben wurde (mit einem Erfolgscode), kann ich ihren Status und Nachrichtentext nicht ändern, um Informationen über den Fehler bereitzustellen.Eine Transaktion pro Anfrage - Servlet-Antwort ist zu früh festgeschrieben

Ich brauche die Servlet-Antwort in meinem Filter modifizierbar sein, aber etwas verpflichtet es.

Ich habe jackson commits deaktiviert, aber gleich nach dem letzten Filter (WsFilter) wird die Nachricht trotzdem commited. Die Puffergröße ist so groß wie möglich. Ich denke, der eingebettete Tomcat wird standardmäßig nach WsFilter festgeschrieben.

Ich habe auch versucht, einen Wrapper und Verbieten Flush, bis eine boolesche Flag auf True in meinem Transaktionsfilter festgelegt ist, aber null Zeiger Ausnahme occastres - coyoteResponse ist null.

Wie behalte ich eine Antwort nicht festgeschrieben?

+0

Sie brauchen nichts zu gewährleisten ServletResponse geschrieben wird, bevor alle Commits – ControlAltDel

+0

Teilen Sie den Wrapper-Code gelungen – Mudassar

Antwort

0

Ich endete mit ContentCachingResponseWrapper. Auf diese Weise verwenden alle Filter nach meinem Transaktionsfilter den Wrapper anstelle der ursprünglichen Antwort. Da die ursprüngliche Antwort nicht geändert wurde, wird sie nicht ausgeführt. Nachdem mein Filter die Transaktion beendet hat, rufe ich responseWrapper.copyBodyToResponse() auf, um alle Daten vom Wrapper zur ursprünglichen Antwort zu "leeren".

im Allgemeinen sieht der Code wie folgt aus:

// create a transaction 
// create a wrapper 
chain.doFilter(request, responseWrapper); 
// end the transaction 
responseWrapper.copyBodyToResponse();