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 建议使用 onErrorResume
或 filter
用于您的用例:
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
我创建了一个 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 建议使用 onErrorResume
或 filter
用于您的用例:
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