Каково ожидаемое поведение, когда WebClient bodyToMono встречает пустое тело?В моем конкретном примере мы проверяем статус, возвращаемый после звонка, и, если это ошибка, преобразуем его в наш пользовательский формат ошибок.Если преобразование в пользовательский формат ошибок завершается неудачно, мы создаем новую ошибку в нашем пользовательском формате с указанием этого.Но когда пришел ответ, который был ошибкой с пустым телом, он не смог отправить какую-либо ошибку обратно, потому что bodyToMono не дал сбой, как я ожидал.См. Ниже блок кода:
.retrieve()
.onStatus(HttpStatus::isError) { response ->
response.bodyToMono(ErrorResponse::class.java)
.doOnError {
throw APIException(
code = UNEXPECTED_RESPONSE_CODE,
reason = it.message ?: "Could not parse error response from Inventory Availability",
httpStatus = response.statusCode()
)
}
.map {
throw APIException(
reason = it.errors.reason,
code = it.errors.code,
httpStatus = response.statusCode()
)
}
}
Чтобы исправить это, мы добавили switchIfEmpty.
.retrieve()
.onStatus(HttpStatus::isError) { response ->
response.bodyToMono(ErrorResponse::class.java)
.switchIfEmpty { throw RuntimeException("Received Empty Response Body") }
.doOnError {
throw APIException(
code = UNEXPECTED_RESPONSE_CODE,
reason = it.message ?: "Could not parse error response from Inventory Availability",
httpStatus = response.statusCode()
)
}
.map {
throw APIException(
reason = it.errors.reason,
code = it.errors.code,
httpStatus = response.statusCode()
)
}
}
Мой вопрос такой: это ожидаемое поведение от bodyToMono?Так как я явно прошу отобразить тело ответа на мой объект ErrorResponse, я бы ожидал, что пустое тело будет содержать ошибку, а затем попадет в блок doOnError, но вместо этого он просто «преуспеет» / вернет пустой моно ... отсюда мы добавляемблок switchIfEmpty.Если объект, который мы отображали, имел пустые поля, я мог видеть, что в нем нет ошибки, но поскольку все поля обязательны, почему bodyToMono не выдает ошибку при попытке сопоставить «ничто» с моим объектом?