Как использовать пользовательские ResponseErrorHandler и ClientHttpRequestFactory в одном и том же RestTemplate? - PullRequest
0 голосов
/ 14 мая 2019

Я использую RestTemplate и добавил обработчик для обработки некоторых ошибок:

@Configuration
public class IntegrationConfiguration {

@Bean
public RestTemplate restTemplate() {

    return new RestTemplateBuilder()
            .errorHandler(new CustomErrorHandler())
            .setConnectTimeout(4000)
            .setReadTimeout(4000)
            .build();
}

Вот реализация CustomErrorHandler:

public class CustomErrorHandler implements ResponseErrorHandler {

@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
    return response.getStatusCode().is4xxClientError() || 
           response.getStatusCode().is5xxServerError();
}

@Override
public void handleError(ClientHttpResponse response) throws IOException {

    final String body = new BufferedReader(new InputStreamReader(response.getBody()))
              .lines().collect(Collectors.joining("\n"));
    // more non important code...
} 

Но я получаю

java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1692)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)

Когда я пытаюсь response.getBody(). Я нашел этот ответ , но как его реализовать, как я могу установить реализацию ClientHttpRequestFactory (как показано выше), если этот ответ просто принимает классы, расширяющие ClientHttpRequestFactory?

ClientHttpRequestFactory - это функциональный интерфейс.

1 Ответ

0 голосов
/ 15 мая 2019

Мне удалось сделать это, используя конструктор с HttpRequestFactory в качестве аргумента и ErrorHandler, вставленный с установщиком:

@Bean
public RestTemplate restTemplate() {
    final SimpleClientHttpRequestFactory httpRequestFactory = new SimpleClientHttpRequestFactory();
    httpRequestFactory.setOutputStreaming(false);
    httpRequestFactory.setConnectTimeout(config.getTimeOut()*1000);
    httpRequestFactory.setReadTimeout(config.getTimeOut()*1000);

    final RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
    restTemplate.setErrorHandler(new CustomErrorHandler());
    return restTemplate;
}
...