Почему я получаю «Разрешено только одно подключение для получения подписчика», когда в ответе есть код состояния ошибки HTTP?

В запросе на отдых я отправляю другой запрос в веб-службу с помощью Spring WebClient и хочу вернуть результат вызывающей стороне:

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

Теперь, когда веб-служба возвращает код состояния ошибки 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-разработчик может их прочитать :)


person Tobi    schedule 06.01.2019    source источник


Ответы (1)


Это известная проблема в Spring Framework, и она была исправлена ​​в Spring Framework 5.1.4 — см. SPR- 17564.

К сожалению, мне неизвестно какое-либо обходное решение этой проблемы, поэтому обновление до Spring Framework 5.1.4/Spring Boot 2.1.2 — пока единственное решение.

person Brian Clozel    schedule 07.01.2019