BodyToMono WebClient на пустое тело ожидаемого поведения

Каково ожидаемое поведение, когда 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 не выдает ошибку при попытке сопоставить "ничто" с моим объектом?

0 ответов

Это правильно. Mono может создавать элементы 0..1, а пустое тело просто создает моно, которое завершается без выдачи значения, как и Mono.empty().

Если в вашем случае нет тела ошибки, вы можете вызвать.single() в своем моно.

Другие вопросы по тегам