当 WebClient bodyToMono 遇到空主体时,预期的行为是什么?在我的具体示例中,我们正在检查从 post 调用返回的状态,如果将其转换为我们的自定义错误格式是错误的。如果转换为自定义错误格式失败,我们会在自定义格式中创建一个新错误,说明这一点。但是,当响应是一个空主体的错误时,它根本没有发回任何错误,因为 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 在尝试将“无”映射到我的对象时不会抛出错误?