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

Spring Boot WebFlux : WebFilter ne fonctionne pas

PHPz
Libérer: 2024-02-09 09:30:31
avant
675 Les gens l'ont consulté

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

}
Copier après la connexion

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

}
Copier après la connexion

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;
        });
  }
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal