每个请求一个事务 - servlet响应过早提交

时间:2016-06-24 15:36:36

标签: java spring tomcat transactions spring-boot

我正在尝试在Spring启动应用程序中为每个请求实现一个事务。 我有一个HIGHEST_PRECEDENCE命令的过滤器,用于打开一个事务,让其他过滤器和应用程序的服务完成它们的工作并提交事务。但是,如果提交失败,servlet响应已经被写入并提交(带有成功代码),我无法修改它的状态和消息体以提供有关错误的信息。

我需要在我的过滤器中修改servlet响应,但有些东西会提交它。

我已经禁用了jackson提交,但是在最后一个过滤器(WsFilter)之后,无论如何都会提交消息。缓冲区大小尽可能大。我想嵌入式tomcat在WsFilter之后默认提交?

我还尝试使用包装器并禁止刷新,直到我的事务过滤器中的布尔标志设置为true,但是出现空指针异常 - coyoteResponse为空。

如何保持未提交的回复?

1 个答案:

答案 0 :(得分:0)

我最终使用了ContentCachingResponseWrapper。这样,我的事务过滤器之后的所有过滤器都使用包装器而不是原始响应。由于原始响应未受影响,因此未提交。在我的过滤器关闭事务后,我调用responseWrapper.copyBodyToResponse()将所有数据从包装器“刷新”到原始响应。

一般来说,代码如下所示:

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