Autowired RestTemplate возвращает неправильный ResponseErrorHandler - PullRequest
0 голосов
/ 18 сентября 2018

все. Сейчас я работаю в проекте Spring Boot, одной из функций которого является отправка некоторых HTTP-запросов стороннему API и получение ответов.

Я решил использовать RestTemplate в качестве http-клиента и создал bean-компонент для RestTemplate в java-файле с @Configuration

@Bean
public RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();

    restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
    List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
    if (CollectionUtils.isEmpty(interceptors)) {
        interceptors = new ArrayList<>();
    }
    interceptors.add(new RequestLoggingInterceptor());
    restTemplate.setInterceptors(interceptors);
    restTemplate.setErrorHandler(new RestResponseErrorHandler());

    return restTemplate;
}

Пользовательский обработчик ошибок и перехватчик ведения журнала установлены в restTemplate. Затем я ввел RestTemplate в свой класс обслуживания с помощью

@Autowired
RestTemplate restTemplate;

Однако я обнаружил, что мой пользовательский обработчик ошибок не работает должным образом, и я попытался проверить обработчик ошибок с помощью

ResponseErrorHandler customErrorHandler = restTemplate.getErrorHandler();

Я обнаружил, что ErrorHandler по-прежнему DefaultResponseErrorHandler, но не мой пользовательский errorHandler. Зачем? Что-то не так?

Обновлено

Ниже приведены мой пользовательский обработчик ошибок и перехватчик ведения журнала

public class RestResponseErrorHandler implements ResponseErrorHandler {

@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
    if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
        return true;
    }
    return false;
}

@Override
public void handleError(ClientHttpResponse response) throws IOException {
    if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
        throw new RestResponseErrorException(response.getStatusCode() + "" + response.getStatusText());
    }
}
}

и

public class RequestLoggingInterceptor implements ClientHttpRequestInterceptor {

private final Logger log = LoggerFactory.getLogger(this.getClass());

@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
    throws IOException {
    logRequest(request, body);
    ClientHttpResponse response = execution.execute(request, body);
    logResponse(response);
    return response;
}

private void logRequest(HttpRequest request, byte[] body) throws IOException {
    if (log.isDebugEnabled()) {
        log.debug("Request begin -----------------------------");
        log.debug("URI:{}", request.getURI());
        log.debug("Method:{}", request.getMethod());
        log.debug("Headers:{}", request.getHeaders().toString());
        log.debug("Request body:{}", new String(body, "UTF-8"));
        log.debug("Request end -----------------------------");
    }
}

private void logResponse(ClientHttpResponse response) throws IOException {
    if (log.isDebugEnabled()) {
        log.debug("Response begin  -----------------------------");
        log.debug("Status code:{}", response.getStatusCode());
        log.debug("Status text:{}", response.getStatusText());
        log.debug("Headers:{}", response.getHeaders().toString());
        log.debug("Response body:{}", StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
        log.debug("Response end -----------------------------");
    }
}
}
...