Есть ли функции, аналогичные DefaultResponseErrorHandler для RestTemplate? - PullRequest
0 голосов
/ 02 мая 2018

Библиотека, которую я поддерживаю в своей компании, предоставляет пользовательскую реализацию DefaultResponseErrorHandler, которую мы назначаем через RestTemplateCustomizer. Эта реализация просматривает фактический код состояния http ответа и переводит его.

По сути, наш класс переопределяет

@Override
protected void handleError(ClientHttpResponse response, HttpStatus statusToReturn) throws IOException {
  super.handleError(response, someOtherStatusThatIsComputedInternally);
}

Мы просто передаем другой код состояния, и Spring позаботится о создании соответствующего HttpClientErrorException / HttpServerErrorException.

Я пытаюсь воспроизвести эту функцию в WebClient, используя ExchangeFilterFunction (& введите через WebClientCustomizer), но я не совсем уверен, как это сделать, поскольку ClientResponse.statusCode() уже установлен и не может быть переопределено, и, похоже, у меня нет доступа к возможности переопределить создание WebClientResponseException.

Есть идеи / советы?

1 Ответ

0 голосов
/ 03 мая 2018

Я смог сделать то, что мне нужно было, используя встроенный ClientResponseWrapper, который предоставляет Spring.

В моем ExchangeFilterFunction я делаю это:

@Override
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
    return next.exchange(request).flatMap(this::handleAnyErrors);
}

private Mono<ClientResponse> handleAnyErrors(ClientResponse response) {
    HttpStatus actualHttpStatus = response.statusCode();
    HttpStatus statusToReturn = getActualStatusCodeWeWantToReturn();

    return Mono.just((actualHttpStatus != statusToReturn) ? new ClientResponseStatusCodeWrapper(response, statusToReturn) : response);
}

private static class ClientResponseStatusCodeWrapper extends ClientResponseWrapper {
    private final HttpStatus httpStatus;

    private ClientResponseStatusCodeWrapper(ClientResponse delegate, HttpStatus httpStatus) {
        super(delegate);
        this.httpStatus = httpStatus;
    }

    @Override
    public HttpStatus statusCode() {
        return this.httpStatus;
    }
}
...