Spring 5 Webclient在doAfterSuccessOrError

时间:2019-04-15 06:28:57

标签: java spring reactor-netty

我最终还是一名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,尽管在这个特定问题上这并不重要。

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

3 个答案:

答案 0 :(得分:1)

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

您的代码应类似于

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回调应使用它。否则,内容将自动耗尽以确保释放资源。

答案 1 :(得分:0)

我最终得到了以下代码

webClient
        .method(HttpMethod.POST)
        .uri(uriBuilder -> uriBuilder.pathSegment("api", "payments").build())
        .body(BodyInserters.fromObject(createPostRequest(paymentConfirmationData)))
        .accept(MediaType.APPLICATION_JSON)
        .exchange()
        .doOnSuccess((clientResponse) -> {
            if (clientResponse.statusCode().is5xxServerError()
                    || clientResponse.statusCode().is4xxClientError()) {
                logger.error("POST request naar orchestration layer mislukt, status: [{}]", clientResponse.statusCode());
                throw new RuntimeException("POST request naar orchestration layer mislukt");
            } else {
                logger.error("POST request naar orchestration layer gelukt");
            }
        })
        .doOnError((throwable) -> {
            logger.error("POST request naar orchestration layer mislukt");
            throw new RuntimeException("POST request naar orchestration layer mislukt", throwable);
        })
        .block();

答案 2 :(得分:0)

适合那些寻求如何处理异常和错误处理的人。看看反应堆项目上的此参考文档:https://projectreactor.io/docs/core/release/reference/index.html#_error_handling_operators