【问题标题】:Spring webflux 5.2.3 bodyToMono called after empty Mono in onStatus在 onStatus 中的空 Mono 之后调用 Spring webflux 5.2.3 bodyToMono
【发布时间】:2021-01-08 12:57:08
【问题描述】:

我创建了一个 WebClient 来发出 get 请求,并专门处理 404 错误,我正在使用 onStatus 方法,如下面的 sn-p 所示。

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

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

【问题讨论】:

  • 默认情况下 Mono#empty 将 Create a Mono that completes without emitting any item. 表示它将完成然后继续执行。因此,在您的情况下,如果您只想忽略,请转到bodyToMono,您应该执行switchIfEmpty 之类的操作,然后继续执行您想做的事情,或者返回错误并使用onErrorContinue
  • 感谢@Toerktumlare 的澄清。在新版本中似乎发生了一些变化,当代码在 Spring-webflux 5.0.x 上时,它曾经按预期工作

标签: java spring spring-webflux spring-webclient


【解决方案1】:

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

要完全忽略错误响应,既不传播响应也不传播错误,请使用过滤器,或在下游添加 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

【讨论】:

    【解决方案2】:

    默认情况下Mono#empty 会:

    Create a Mono that completes without emitting any item.

    表示它将完成,然后将继续执行。所以在你的情况下去bodyToMono。如果您只想忽略,您应该执行switchIfEmpty 之类的操作,然后继续执行您想要执行的操作,或者返回Mono#error 并使用onErrorContinue

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2018-09-21
      • 2018-12-12
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 2021-11-18
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多