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请求回调不起作用的主要内容,如果未能解决你的问题,请参考以下文章
带有 WebFlux 的 Spring Boot 总是在测试中抛出 403 状态
jQuery getJSON 回调不起作用 - 即使使用有效的 JSON - 并且似乎使用的是“OPTION”请求而不是“GET”