2016-06-24 34 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(); 
相关问题