Обработка глобального сценария ios в Spring WebFlux - PullRequest
1 голос
/ 10 июля 2020

У меня есть Rest Web Client для вызова API, и я обрабатываю исключения, как указано ниже.

Я хочу обрабатывать ошибки 404, 401 и 400 глобально, а не обрабатывать на уровне отдельного клиента . Как мы можем добиться того же.

public Mono<ProductResponse> getProductInformation(String productId) {
        return webClient.get()
                .uri("/v1/products/"+productId)
                .accept(MediaType.APPLICATION_JSON)
                .retrieve()
                .onStatus( httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus), clientResponse -> {
                    Mono<NotFound> notFound = clientResponse.bodyToMono(NotFound.class);
                    return notFound.flatMap( msg -> {
                        log.info(" Error Message {}" , msg.getErrorMsg());
                        return Mono.error(new NotFoundException(msg.getErrorMsg()));
                    });
                }).onStatus( httpStatus -> HttpStatus.UNAUTHORIZED.equals(httpStatus), clientResponse -> {
                    Mono<NotFound> notFound = clientResponse.bodyToMono(NotFound.class);
                   return Mono.error(new NotAuthorisedException("Unauthorised"));
                }).bodyToMono(ProductResponse.class);
    }

1 Ответ

0 голосов
/ 11 июля 2020

Два подхода:

  1. Все исключения с веб-клиентами заключены в класс WebClientResponseException . Вы можете справиться с этим, используя аннотацию Spring ExceptionHandler , как это.
  @ExceptionHandler(WebClientResponseException.class)
  public ResponseEntity handleWebClientException(WebClientResponseException ex){
    return ResponseEntity.badRequest().body(ex.getResponseBodyAsString());
  }

Примечание. Здесь вы можете написать сложные условные logi c на основе статуса ответа, используя методы например getStatusCode () , getRawStatusCode () , getStatusText () , getHeaders () и getResponseBodyAsString () . Также вы можете получить ссылку на отправленный запрос с помощью метода getRequest .

Использование ExchangeFilterFunction при создании bean-компонента веб-клиента.
  @Bean
  public WebClient buildWebClient() {

    Function<ClientResponse, Mono<ClientResponse>> webclientResponseProcessor =
        clientResponse -> {
          HttpStatus responseStatus = clientResponse.statusCode();
          if (responseStatus.is4xxClientError()) {
            System.out.println("4xx error");
            return Mono.error(new MyCustomClientException());
          } else if (responseStatus.is5xxServerError()) {
            System.out.println("5xx error");
            return Mono.error(new MyCustomClientException());
          }
          return Mono.just(clientResponse);
        };

    return WebClient.builder()
        .filter(ExchangeFilterFunction.ofResponseProcessor(webclientResponseProcessor)).build();
  }

Затем вы можете обработать MyCustomClientException с помощью @ ExceptionHandler или оставьте как есть.

...