Spring webflux 5.2.3 bodyToMono 在 onStatus 中为空 Mono 后调用

Spring webflux 5.2.3 bodyToMono called after empty Mono in onStatus

我创建了一个 WebClient 来发出获取请求,并专门处理 404 错误,我正在使用 onStatus 方法,如下面的代码片段所示。

 client.get()
                .uri(someUrl)
                .headers(someHeaders)
                .retrieve()
                .onStatus(status -> status.equals(HttpStatus.NOT_FOUND), r -> Mono.empty())
                .bodyToMono(MyJsonResponse.class)

当我在响应中收到 404 时,我的期望是它应该 return 一个空的单声道,但是,它也会将后续主体调用为单声道并尝试解析响应,理想情况下它不应该做的。有什么建议吗?

默认情况下 Mono#empty 将:

Create a Mono that completes without emitting any item.

表示它将完成,然后将继续执行。因此,对于您的情况,请转到 bodyToMono。如果你想忽略,你应该做类似 switchIfEmpty 的事情,然后继续选择你想做的事情,或者 return 和 Mono#error 并使用 onErrorContinue

onStatus 方法的最新 javadoc 建议使用 onErrorResumefilter 用于您的用例:

To ignore an error response completely, and propagate neither response nor error, use a filter, or add onErrorResume downstream, for example:

 webClient.get()
     .uri("https://example.com/account/123")
     .retrieve()
     .bodyToMono(Account.class)
     .onErrorResume(WebClientResponseException.class,
          ex -> ex.getRawStatusCode() == 404 ? Mono.empty() : Mono.error(ex));

不久前 Spring 确实发生了行为变化。相关讨论:https://github.com/spring-projects/spring-framework/issues/24736