Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring boot FilterHandlerFunction中处理提交前的响应_Java_Spring Boot_Spring Webflux - Fatal编程技术网

Java 如何在Spring boot FilterHandlerFunction中处理提交前的响应

Java 如何在Spring boot FilterHandlerFunction中处理提交前的响应,java,spring-boot,spring-webflux,Java,Spring Boot,Spring Webflux,我们正在将一个旧的spring应用程序迁移到SpringBoot2.0 目前,我们有一个拦截器,它作为链中的第一个执行,并执行以下操作: 在ThreadLocal 在提交响应之前,将从本地线程中删除唯一id 我正试图找出一种在SpringWebFlux中实现这一点的方法。我可以使用WebFilter实现来实现;但是,由于我使用RouterFunction作为控制器,所以我试图检查是否有办法通过HandlerFilterFunction实现这一点 public class TxIdFilter

我们正在将一个旧的spring应用程序迁移到SpringBoot2.0

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

  • ThreadLocal
  • 在提交响应之前,将从本地线程中删除唯一id
我正试图找出一种在SpringWebFlux中实现这一点的方法。我可以使用
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);
  }
}
公共类TxIdFilter实现HandlerFilterFunction{
/**
*{@inheritardoc}
*/
@凌驾
公共单声道过滤器(ServerRequest请求,HandlerFunction下一步){
/*
*如何实现以下目标(可以做到哪一点
*使用WebFilter)
* 
*exchange.getResponse().beforeCommit(()->{
*logger.debug(“清理tx id…”);
*AppTransactionContext.removeAll();
*返回Mono.empty();
* });
*/
下一步返回。处理(请求);
}
}

以下是您如何做到这一点的,尽管我在这里使用了一个请求属性:

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模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程


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

以下是您如何做到这一点,尽管我在这里使用了请求属性:

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模型不同,请求不绑定到特定线程。请求处理可以在任何给定时间跳到不同的线程


根据您的实际用例(我不确定此事务ID在这里可能意味着什么),您还可以在各自的用例中查看和了解它们如何解决该问题。

谢谢Brian;我最终使用了
doFinally
,这很有效。关于tx id,每当有请求来到我们的应用程序时,我们希望设置一个id,然后将其传递到所有层(dao、服务等),然后在响应提交之前,删除该id。这就是我们使用过滤器的原因。我完全同意你的观点;但不太确定如何在反应式应用程序中实现它(即使使用上下文API)。在这方面还有什么帮助吗?看这里:谢谢布莱恩;我最终使用了
doFinally
,这很有效。关于tx id,每当有请求来到我们的应用程序时,我们希望设置一个id,然后将其传递到所有层(dao、服务等),然后在响应提交之前,删除该id。这就是我们使用过滤器的原因。我完全同意你的观点;但不太确定如何在反应式应用程序中实现它(即使使用上下文API)。还有其他帮助吗?请参见此处: