【问题标题】:One transaction per request - servlet response is committed too early每个请求一个事务 - servlet 响应提交得太早
【发布时间】:2016-10-27 07:02:05
【问题描述】:

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

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

我已禁用杰克逊提交,但在最后一个过滤器 (WsFilter) 之后,无论如何都会提交消息。缓冲区大小尽可能大。我猜在 WsFilter 之后默认情况下嵌入的 tomcat 提交?

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

如何保持未提交的响应?

【问题讨论】:

  • 您需要确保在所有提交成功之前没有向 ServletResponse 写入任何内容
  • 分享包装代码

标签: java spring tomcat transactions spring-boot


【解决方案1】:

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

通常代码如下所示:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多