Почему я получаю `Только одно соединение получает подписчика, которому разрешено`, если в ответе содержится код ошибки HTTP? - PullRequest
0 голосов
/ 06 января 2019

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

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

Теперь, когда webservice возвращает код состояния ошибки 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 голосов
/ 07 января 2019

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

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

...