Maison  >  Article  >  Spring Boot WebFlux : WebFilter ne fonctionne pas

Spring Boot WebFlux : WebFilter ne fonctionne pas

PHPz
PHPzavant
2024-02-09 09:30:31591parcourir

L'éditeur PHP Banana a présenté que Spring Boot WebFlux est un framework Web basé sur une programmation réactive, qui fournit un moyen asynchrone et non bloquant de traiter les requêtes HTTP. Cependant, nous pouvons parfois rencontrer le problème que WebFilter ne fonctionne pas. WebFilter est un composant utilisé pour effectuer certaines actions avant ou après qu'une requête entre dans une application Web. Cet article explorera les raisons possibles pour lesquelles WebFilter ne fonctionne pas et fournira des solutions pour garantir que WebFilter fonctionne correctement dans Spring Boot WebFlux.

Contenu de la question

J'ai le contrôleur suivant qui renvoie un mono de chaîne

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

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

}

J'ai ajouté un filtre Web du bean pour effectuer un traitement lorsque la requête arrive, le problème est que le message dans le bean n'est pas affiché dans la console, j'ai essayé d'ajouter des points d'arrêt pour déboguer, mais lorsque je teste l'API, cela ne s'arrête pas à le point d'arrêt. En actuator/beans 中,我找到了 bean slf4jmdcfilter. Y a-t-il une autre configuration à ajouter ?

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

}

Solution de contournement

Cela peut être fait en utilisant defercontextual(function) & transformationdifféréecontextuelle(bifonction)

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer