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

Spring boot WebFlux:WebFilter 不起作用

PHPz
PHPz轉載
2024-02-09 09:30:31648瀏覽

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刪除