如何在 Spring 引导 FilterHandlerFunction 中提交之前处理响应

How to handle response before commit in Spring boot FilterHandlerFunction

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

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

我正在尝试找出一种在 Spring WebFlux 中实现它的方法。我可以使用 WebFilter 实现来做到这一点;然而,由于我使用 RouterFunction 作为控制器,我试图检查是否有办法通过 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 模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程。

Reactor provides a Context API for those uses cases.

根据您的实际用例(我不确定此事务 ID 在这里可能意味着什么),您还可以查看 Spring Cloud Sleuth and Micrometer 以及他们如何在各自的用例中解决该问题.