当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 :(得分:1)
这是正确的。一个Mono可以产生0..1个元素,而一个空的主体只会产生一个不发出值而完成的Mono,就像Mono.empty()一样。
如果用例中没有错误,则可以在mono上调用.single()。