gpt4 book ai didi

java - 如何在 Spring boot FilterHandlerFunction 提交之前处理响应

转载 作者:行者123 更新时间:2023-12-02 02:17:26 24 4
gpt4 key购买 nike

我们正在将旧的 Spring 应用程序迁移到 Spring Boot 2.0。

目前我们有一个拦截器,它作为链中的第一个执行并执行以下操作:

  • ThreadLocal中设置唯一的ID
  • 在提交响应之前,将从本地线程中删除唯一 ID。

我正在尝试找出一种在 Spring WebFlux 中实现此功能的方法。我可以使用 WebFilter 实现来做到这一点;但是,由于我使用 RouterFunction 作为 Controller ,我试图检查是否有办法通过 HandlerFilterFunction 实现此目的。

public class TxIdFilter implements HandlerFilterFunction<ServerResponse, ServerResponse> {
/**
* {@inheritDoc}
*/
@Override
public Mono<ServerResponse> filter(ServerRequest request, HandlerFunction<ServerResponse> next) {
/*
* How to achieve following (which can be done
* using WebFilter)
*
* exchange.getResponse().beforeCommit(() -> {
* logger.debug("Cleaning up the tx id...");
* AppTransactionContext.removeAll();
* return Mono.empty();
* });
*/
return next.handle(request);
}
}

最佳答案

以下是您可以执行此操作的方法,尽管我在这里使用了请求属性:

public class SampleFilterFunction implements HandlerFilterFunction {

@Override
public Mono filter(ServerRequest request, HandlerFunction next) {
request.attributes().put("key", "value");
return next.handle(request)
.doOnSuccessOrError((value, error) -> request.attributes().remove("key"));
}
}

此处不应依赖 ThreadLocal,因为与 Servlet Spring MVC 模型不同,请求不绑定(bind)到特定线程。请求处理可以在任何给定时间跳到不同的线程。

Reactor provides a Context API for those uses cases .

根据您的实际用例(我不确定这个交易 ID 在这里可能意味着什么),您还可以查看 Spring Cloud SleuthMicrometer以及他们如何在各自的用例中解决该问题。

关于java - 如何在 Spring boot FilterHandlerFunction 提交之前处理响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094994/

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