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