обрабатывать исключение с помощью Mono.zip из ответа API-вызовов Spring web flux - PullRequest
0 голосов
/ 11 июля 2020

У меня есть следующий код. Я пытаюсь заархивировать содержимое. p1Mono и p2Mono - это вызовы API удаленных служб. Они генерируют различные коды ответа HTTP. Как мне обработать эти ошибки API и вернуть исключение с соответствующими кодами?

 return Mono.zip(p1Mono,
                       p2Mono).flatMap(data -> {
            P1 p1 = data.getT1();
            p2 p2 = data.getT2();
            //some operation and combine result to p
            return Mono.just(p);
        });

1 Ответ

1 голос
/ 11 июля 2020

Как насчет чего-то вроде этого:

Примечание. Вы можете определять отдельные пользовательские исключения или даже обрабатывать свои ошибки другими способами.

    Mono<ClientResponse> api1ResponseMono = webClient.post().uri("/some/api1").exchange();
    Mono<ClientResponse> api2ResponseMono = webClient.post().uri("/some/api2").exchange();

    return Mono.zip(api1ResponseMono,api2ResponseMono)
        .flatMap(tuple -> {
          ClientResponse api1Response = tuple.getT1();
          ClientResponse api2Response = tuple.getT2();

          HttpStatus api1ResponseHttpStatus = api1Response.statusCode();
          if(api1ResponseHttpStatus.is4xxClientError() || api1ResponseHttpStatus.is5xxServerError()){

            return api1Response.bodyToMono(String.class)
                      .flatMap(api1ResponseBody -> {
                        return Mono.error(new MyCustomException("Call to Api1 failed with response code: " + api1ResponseHttpStatus.value() + " because: " + api1ResponseBody));
                      });

          }

          HttpStatus api2ResponseHttpStatus = api2Response.statusCode();
          if(api2ResponseHttpStatus.is4xxClientError() || api2ResponseHttpStatus.is5xxServerError()){

            return api2Response.bodyToMono(String.class)
                .flatMap(api2ResponseBody -> {
                  return Mono.error(new MyCustomException("Call to Api2 failed with response code: " + api2ResponseHttpStatus.value() + " because: " + api2ResponseBody));
                });

          }

          Mono<MyCustomResponsePojo1> api1ResponseBodyMono = api1Response.bodyToMono(MyCustomResponsePojo1.class);
          Mono<MyCustomResponsePojo2> api2ResponseBodyMono = api1Response.bodyToMono(MyCustomResponsePojo2.class);

          return Mono.zip(api1ResponseBodyMono,api2ResponseBodyMono)
              .flatMap(t -> {
                MyCustomResponsePojo1 api1ResponseBody  =t.getT1();
                MyCustomResponsePojo2 api2ResponseBody  =t.getT2();
                //some operation and combine result to p
                return Mono.just(p);
              });
        });
...