Spring webflux请求回调不起作用

Posted

技术标签:

【中文标题】Spring webflux请求回调不起作用【英文标题】:Spring webflux request callback not working 【发布时间】:2020-04-23 20:53:54 【问题描述】:

我正在使用 spring-webflux 5.1.7-RELEASE。我想在发送请求之前触发 webclient 的回调。代码如下:

ExchangeFilterFunction logRequest (SomeLogObject someLogObject) 
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> 
        /**
         business logic for callback goes here
         */
        return Mono.just(clientRequest);
    );


//code for plugging in logRequest callback (at some othe place)
WebClient webClient = WebClient
        .builder()
        .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
        .baseUrl(baseURL)
        .filters(exchangeFilterFunctions -> exchangeFilterFunctions.add(logRequest(someLogObject)))
        .build();

webClient
        .get()
        .uri(uriBuilder -> uriBuilder.path("some_uri_path").queryParams(queryParam).build())
        .header("some_header_key", "some_header_value")
        .retrieve().bodyToMono(String.class);

这里 logRequest 是在开始时触发的(远在触发请求之前)。根据我的调试,我发现它在调用retrieve() 时被触发。

有没有办法确保在发送请求之前立即触发 logRequest,而不是在创建单声道时触发?

提前致谢

【问题讨论】:

你能给个完整的minimal reproducible example吗?我希望logRequest() 会立即被调用,但我希望您标记的“回调业务逻辑”在发出请求时执行,而不是在创建单声道时执行。 @MichaelBerry 你是对的 logRequest() 被立即调用。但是在调用retrieve() 方法时也会调用业务逻辑。我想将它延迟到请求执行之前。业务逻辑是一个日志语句。它记录请求开始执行时的时间戳,例如log.info("开始时间是",currtimeinmillis) 我真的不明白你想做什么 【参考方案1】:

我认为您正在寻找以下更改:

ExchangeFilterFunction logRequest (SomeLogObject someLogObject)
    return ExchangeFilterFunction.ofRequestProcessor(clientRequest ->
            Mono.defer(() -> 
                /**
                 business logic for callback goes here
                 */
                return Mono.just(clientRequest);
            )
    );

Mono.defer() 将延迟代码执行,直到真正的请求。

【讨论】:

我会试试这个并回复你 我试过这个。 defer 适用于我的情况。我会接受的。 很高兴听到这个消息!

以上是关于Spring webflux请求回调不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Webflux 功能数据库更新不起作用

Spring Boot WebFlux 不工作请求控制器

为啥 WebFlux-WebClient 超时不起作用?

Webflux 安全登录失败处理程序不起作用

带有 WebFlux 的 Spring Boot 总是在测试中抛出 403 状态

jQuery getJSON 回调不起作用 - 即使使用有效的 JSON - 并且似乎使用的是“OPTION”请求而不是“GET”