首页 > 解决方案 > 如何在同一个 RestTemplate 中使用自定义的 ResponseErrorHandler 和 ClientHttpRequestFactory?

问题描述

我正在使用 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 是一个功能接口。

标签: error-handlingresttemplate

解决方案


我设法使用带有 HttpRequestFactory 作为参数的构造函数并使用 setter 插入 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;
}

推荐阅读