Spring 5 Webclient создает исключение в doAfterSuccessOrError - PullRequest
0 голосов
/ 15 апреля 2019

Я - разработчик 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. Однако я не могу использовать бросаемую причину, потому что это просто добавляет ловушку вокруг него. Я прочитал несколько статей, и это моя последняя попытка добавить Mono.error (throwable), но поскольку возврата нет, я почти уверен, что это причина отсутствия эффекта.

Это вызов POST, который возвращает 204 No Content в случае успеха. На данный момент я получаю 422, хотя это не должно быть важно в этом конкретном вопросе.

Может ли кто-нибудь научить меня, как создавать исключения в вызывающей среде?

Ответы [ 3 ]

1 голос
/ 15 апреля 2019

Существует специальный метод для обработки кодов состояния. Подробнее здесь

Ваш код должен выглядеть как

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 должен его использовать. В противном случае содержимое будет автоматически удалено, чтобы обеспечить освобождение ресурсов.

0 голосов
/ 27 июня 2019

Для тех, кто ищет подход к обработке исключений и ошибок. Взгляните на этот справочный документ по проекту реактора: https://projectreactor.io/docs/core/release/reference/index.html#_error_handling_operators

0 голосов
/ 30 апреля 2019

В итоге я получил следующий код

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();
...