Heim > Java > Hauptteil

Spring Boot WebFlux: WebFilter funktioniert nicht

PHPz
Freigeben: 2024-02-09 09:30:31
nach vorne
650 Leute haben es durchsucht

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");
    }

}
Nach dem Login kopieren

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

}
Nach dem Login kopieren

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;
        });
  }
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage