Как насчет чего-то вроде этого:
Примечание. Вы можете определять отдельные пользовательские исключения или даже обрабатывать свои ошибки другими способами.
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);
});
});