springwebflux5.2.3bodytomono在onstatus中的空mono之后调用

mrphzbgm  于 2021-06-27  发布在  Java
关注(0)|答案(2)|浏览(500)

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

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

当我在响应中得到404时,我的期望是它应该返回一个空的mono,然而,它也调用mono的后续body并尝试解析响应,理想情况下它不应该这样做。有什么建议吗?

wgmfuz8q

wgmfuz8q1#

最新的javadoc onStatus 方法建议使用 onErrorResume 或者 filter 对于您的用例:
要完全忽略错误响应,既不传播响应也不传播错误,请使用筛选器,或向下游添加onerrorresume,例如:

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

piv4azn7

piv4azn72#

默认情况下,mono#empty将: Create a Mono that completes without emitting any item. 意味着它将完成,然后执行将继续。就像你的情况一样去 bodyToMono . 如果你想忽略,你应该做一些类似的事情 switchIfEmpty 然后继续挑选你想做的事情,或者返回一个 Mono#error 使用 onErrorContinue

相关问题