2016-06-24 65 views
1

我試圖在我的spring引導應用程序中爲每個請求實現一個事務。 我有一個HIGHEST_PRECEDENCE命令的過濾器打開一個事務,讓其他過濾器和應用程序的服務完成他們的工作並提交事務。但是,如果提交失敗,servlet響應已經被寫入並提交(使用成功代碼),我無法修改其狀態和消息正文以提供有關錯誤的信息。每個請求一個事務 - servlet響應提交得太早

我需要servlet響應在我的過濾器中可修改,但有些事情提交它。

我已經禁用了jackson提交,但在最後一個過濾器(WsFilter)後立即提交了消息。緩衝區大小盡可能大。我猜嵌入式tomcat在WsFilter之後默認提交?

我也試過使用包裝和禁止刷新,直到在我的事務篩選器中將布爾標誌設置爲true,但發生空指針異常 - coyoteResponse爲空。

我如何保持響應未提交?

+0

你需要確保沒有被寫入ServletResponse的所有提交成功 – ControlAltDel

+0

之前分享的包裝代碼 – Mudassar

回答

0

我結束了使用ContentCachingResponseWrapper。這樣,我的事務過濾器之後的所有過濾器都使用包裝器而不是原始響應。由於原始響應未觸及,因此未提交。在我的過濾器關閉事務後,我調用responseWrapper.copyBodyToResponse()將包裝器中的所有數據「刷新」爲原始響應。

一般

的代碼如下所示:

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