当响应具有HTTP错误状态代码时,为什么为什么我只有一个连接允许订阅者?

时间:2019-01-06 11:29:33

标签: java kotlin reactive-programming spring-webflux project-reactor

在休息请求中,我使用Spring WebClient向Web服务发送了另一个请求,并希望将结果返回给调用者:

return webClient.post()
  .uri(url)
  .body(...)
  .retrieve()
  .bodyToMono(String::class.java)
  .map { ResponseEntity.ok(it) }

现在,Web服务返回HTTP错误状态代码,我收到以下错误:

java.lang.IllegalStateException: Only one connection receive subscriber allowed.

返回状态码200时,不会引发任何错误。

我也尝试检查状态并自己引发异常,但是行为仍然相同:

return webClient.post()
  .uri(url)
  .body(...)
  .retrieve()
  .onStatus(HttpStatus::isError) { clientResonse ->
     clientResonse.bodyToMono(String::class.java)
        .map { RuntimeException(it) }
  }
  .bodyToMono(String::class.java)
  .map { ResponseEntity.ok(it) }

我在做什么错了?

代码示例在Kotlin中,但我认为每个Java开发人员都可以阅读它:)

1 个答案:

答案 0 :(得分:2)

这是Spring Framework中的一个已知问题,已在Spring Framework 5.1.4中修复-请参见SPR-17564

不幸的是,我不知道该问题有任何解决方法,因此到目前为止,升级到Spring Framework 5.1.4 / Spring Boot 2.1.2是唯一的解决方案。