Два подхода:
- Все исключения с веб-клиентами заключены в класс 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 или оставьте как есть.