java - Spring 5 Webclient 在 doAfterSuccessOrError 中抛出异常
问题描述
我是一名 java 7 开发人员(终于)在 java 8 中迈出了第一步。很多这些东西对我来说仍然是新的。我正在尝试使用 spring 5 WebClient,因为文档指出 RestTemplate 将被移走以支持 WebClient。
webClient
.method(HttpMethod.POST)
.uri(uriBuilder -> uriBuilder.pathSegment("api", "payments").build())
.body(BodyInserters.fromObject(createPostRequest(paymentConfirmationData)))
.accept(MediaType.APPLICATION_JSON)
.exchange()
.doAfterSuccessOrError((clientResponse, throwable) -> {
if (clientResponse.statusCode().is5xxServerError()
|| clientResponse.statusCode().is4xxClientError()) {
logger.error("POST request naar orchestration layer mislukt, status: [{}]", clientResponse.bodyToMono(String.class));
Mono.error(throwable);
} else {
logger.error("POST request naar orchestration layer gelukt");
}
})
.block();
我试图在 .doAfterSuccesOrError 中引发异常。但是我不能使用 throw throwable 原因然后它只是在它周围添加一个 try catch 。我读了几篇文章,这是我最后一次尝试添加 Mono.error(throwable) 但由于没有返回,我很确定这是没有效果的原因。
这是一个 POST 调用,成功时返回 204 No Content。目前我得到的是 422,尽管这在这个特定问题中并不重要。
有人可以教我如何将异常抛出回调用环境吗?
解决方案
有一种处理状态码的特殊方法。更多在这里
您的代码应如下所示
webClient.method(HttpMethod.POST)
.uri(uriBuilder -> uriBuilder.pathSegment("api", "payments").build())
.body(BodyInserters.fromObject(createPostRequest(paymentConfirmationData)))
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.onStatus(HttpStatus::is4xxServerError, response -> ...)
.onStatus(HttpStatus::is5xxServerError, response -> ...)
...
.block();
请记住,当onStatus
使用时,如果期望响应具有内容,则onStatus
回调应该使用它。如果没有,内容将被自动排空以确保资源被释放。
推荐阅读
- calendar - 取消订阅 webcal
- angular - 将更多参数解析为 Angular 指令作为单独的参数
- python - 如何在基于值条件的切片之后获取数据框中的下一行?
- download - 将 ZIP 转换为 Blob
- postgresql - 如何修复 Symfony 和 PostgreSQL 中的“找不到驱动程序错误”
- bash - 如何使用参数扩展存储在 sh 变量中的命令?
- javascript - JavaScript 图像被键盘改变
- forms - Phoenix 框架模板中的自定义选择
- python - 通过 * 或 ** 将参数传递给函数
- prometheus - 使用 Prometheus 监控 OOM