首页  >  文章  >  Spring boot WebFlux:WebFilter 不起作用

Spring boot WebFlux:WebFilter 不起作用

PHPz
PHPz转载
2024-02-09 09:30:31591浏览

php小编香蕉介绍,Spring Boot WebFlux是一种基于响应式编程的Web框架,提供了一种异步非阻塞的方式处理HTTP请求。然而,有时候我们可能会遇到WebFilter不起作用的问题。WebFilter是用于在请求进入Web应用程序之前或之后执行某些操作的组件。本文将探讨可能导致WebFilter不起作用的原因,并提供解决方案,以确保WebFilter在Spring Boot WebFlux中正常工作。

问题内容

我有下面的控制器,它返回字符串的 mono

@restcontroller
@requestmapping("api/v1/test")
public class testcontroller {

    @postmapping
    public mono<string> getdraft() {
        return mono.just("ok");
    }

}

我添加了bean webfilter来在请求到来时进行一些处理,问题是bean中的消息没有显示在控制台中,我尝试添加断点来调试,但是当我测试api时却没有停在断点处。在 actuator/beans 中,我找到了 bean slf4jmdcfilter。还有另一个配置要添加吗?

@Configuration
public class WebConfig {

    public static final String TRX_ID = "transactionId";
    public static final String PATH_URI = "pathUri";

    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    WebFilter slf4jMdcFilter() {
        return (exchange, chain) -> {
            System.out.println("Filtering request");
            String requestId = exchange.getRequest().getId();
            return chain.filter(exchange)
                    .contextWrite(Context.of(TRX_ID, requestId)
                            .put(PATH_URI, exchange.getRequest().getPath()));
        };
    }

}

解决方法

这可以通过使用 defercontextual(function) & transformdeferredcontextual(bifunction)

@Component
public class YourFilter implements WebFilter {

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    return Mono.deferContextual(contextView -> chain.filter(exchange)
        .contextWrite(context -> context.put("KEY", "VALUE")));
  }
}

// controller
 @Override
  public Mono<String> testApi(ServerWebExchange exchange) {
    return Mono.just("OK")
        .transformDeferredContextual((data, context) -> {
          log.info("context is {}", (Object) context.get("KEY"));
          return data;
        });
  }

以上是Spring boot WebFlux:WebFilter 不起作用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除