Heim  >  Artikel  >  Spring Boot WebFlux: WebFilter funktioniert nicht

Spring Boot WebFlux: WebFilter funktioniert nicht

PHPz
PHPznach vorne
2024-02-09 09:30:31591Durchsuche

PHP-Editor Banana stellte vor, dass Spring Boot WebFlux ein Web-Framework ist, das auf reaktiver Programmierung basiert und eine asynchrone und nicht blockierende Möglichkeit zur Verarbeitung von HTTP-Anfragen bietet. Manchmal kann es jedoch vorkommen, dass WebFilter nicht funktioniert. WebFilter ist eine Komponente, mit der bestimmte Aktionen ausgeführt werden, bevor oder nachdem eine Anfrage in eine Webanwendung gelangt. In diesem Artikel werden die möglichen Gründe untersucht, warum WebFilter nicht funktioniert, und Lösungen bereitgestellt, um sicherzustellen, dass WebFilter in Spring Boot WebFlux ordnungsgemäß funktioniert.

Frageninhalt

Ich habe den folgenden Controller, der ein Mono aus String zurückgibt

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

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

}

Ich habe einen Bean-Webfilter hinzugefügt, um etwas zu verarbeiten, wenn die Anfrage kommt. Das Problem ist, dass die Nachricht im Bean nicht in der Konsole angezeigt wird. Ich habe versucht, Haltepunkte zum Debuggen hinzuzufügen, aber wenn ich die API teste, bleibt es nicht dabei der Haltepunkt. Im actuator/beans 中,我找到了 bean slf4jmdcfilter. Gibt es eine weitere Konfiguration hinzuzufügen?

@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()));
        };
    }

}

Workaround

Dies kann durch die Verwendung von defercontextual(function) erfolgen & 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;
        });
  }

Das obige ist der detaillierte Inhalt vonSpring Boot WebFlux: WebFilter funktioniert nicht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen