首页 > 解决方案 > 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,尽管这在这个特定问题中并不重要。

有人可以教我如何将异常抛出回调用环境吗?

标签: javaspringreactor-netty

解决方案


有一种处理状态码的特殊方法。更多在这里

您的代码应如下所示

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回调应该使用它。如果没有,内容将被自动排空以确保资源被释放。


推荐阅读