gpt4 book ai didi

java - 每个请求一个事务 - servlet 响应提交得太早

转载 作者:行者123 更新时间:2023-11-28 22:27:18 25 4
gpt4 key购买 nike

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

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

我已经禁用了 jackson 提交,但是在最后一个过滤器 (WsFilter) 之后消息仍然被提交了。缓冲区大小尽可能大。我猜嵌入式 tomcat 默认在 WsFilter 之后提交?

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

如何保持响应未提交?

最佳答案

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

一般来说代码是这样的:

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

关于java - 每个请求一个事务 - servlet 响应提交得太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38017121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com