Добавить обработчик исключений для Spring Web Client - PullRequest
0 голосов
/ 02 июля 2018

Я использую этот код для запросов REST API.

WebClient.Builder builder = WebClient.builder().baseUrl(gatewayUrl);
ClientHttpConnector httpConnector = new ReactorClientHttpConnector(opt -> opt.sslContext(sslContext));
builder.clientConnector(httpConnector);

Как добавить обработчик исключений при подключении? Я хотел бы реализовать некоторую пользовательскую логику? Легко ли реализовать эту функцию?

1 Ответ

0 голосов
/ 06 июля 2018

Если я понимаю ваш вопрос в контексте сбоя соединения из-за учетных данных SSL, то вы должны увидеть манифест исключения соединения в ответе REST. Вы можете позаботиться об этом исключении через Flux результат, который вы получите на WebClient.ResponseSpec#onStatus. Документы для #onStatus говорят:

Зарегистрируйте пользовательскую функцию ошибки , которая вызывается при заданном * Предикат HttpStatus применяется. Исключение, возвращаемое из функции будут возвращены с bodyToMono(Class) и bodyToFlux(Class). От по умолчанию обработчик ошибок - это регистр, который выдает WebClientResponseException когда код состояния ответа 4xx или 5xx .

Взгляните на этот пример :

Mono<Person> result = client.get()
            .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .onStatus(HttpStatus::is4xxServerError, response -> ...) // This is in the docs there but is wrong/fatfingered, should be is4xxClientError
            .onStatus(HttpStatus::is5xxServerError, response -> ...)
            .bodyToMono(Person.class);

Аналогично для вашего вопроса, ошибка соединения должна проявиться после того, как вызов сделан, и вы можете настроить, как он распространяется в реактивном конвейере:

Mono<Person> result = client.get()
            .uri("/persons/{id}", id).accept(MediaType.APPLICATION_JSON)
            .retrieve()
            .onStatus(HttpStatus::is4xxClientError, response -> {
                 ... Code that looks at the response more closely...
                 return Mono.error(new MyCustomConnectionException());
             })
            .bodyToMono(Person.class);

Надеюсь, это поможет.

...