Java 使用HttpComponents客户端HttpRequestFactory在RestTemplateBuilder中添加自定义ClientHttpPrequestInterceptor

Java 使用HttpComponents客户端HttpRequestFactory在RestTemplateBuilder中添加自定义ClientHttpPrequestInterceptor,java,spring-boot,spring-rest,Java,Spring Boot,Spring Rest,我需要在所有RestTemplate客户端请求中添加一个自定义头。所以我实现了clienthtprequestinterceptor。我在我的restemplatebuilderconfig中添加了拦截器,如下所示。问题在于,当RestTemplate进行HTTP调用时,它会引发以下异常: java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory canno

我需要在所有RestTemplate客户端请求中添加一个自定义头。所以我实现了
clienthtprequestinterceptor
。我在我的
restemplatebuilder
config中添加了拦截器,如下所示。问题在于,当RestTemplate进行HTTP调用时,它会引发以下异常:

java.lang.ClassCastException: org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory
RESTTemplatebean创建:

@Bean
  public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
    poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
    poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
    CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
    ClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(client);
    restTemplateBuilder = restTemplateBuilder.additionalInterceptors(new MyClientHttpRequestInterceptor());
    return restTemplateBuilder.requestFactory(clientHttpRequestFactory).build();
  }
另外,我将在下面的代码中更新超时:

  protected void setRestTemplateTimeouts() {

    HttpComponentsClientHttpRequestFactory rf =
        (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
    rf.setConnectTimeout(restTemplateProps.getConnectionTimeout());
    rf.setReadTimeout(restTemplateProps.getSocketTimeout());
  }

有人能帮我解决这个问题吗?

问题是,在设置
clienthtprequestinterceptor
后,我试图设置连接和读取超时

在我的
setrestemplatetimeouts()
方法中,当我尝试将&typecast
requestFactory
提取到
httpcomponents客户端httprequestfactory
时,我得到了
ClassCastException
异常,因为
restemplate.getRequestFactory()
返回
拦截clienthttpprequestfactory
而不是
httpcomponents客户端httprequestfactory
。这是因为我在我的restemplate对象中添加了一个拦截器

解决方案是在设置拦截器之前设置超时,因为设置拦截器之后不能设置超时。请参阅以下代码:

@Bean
  public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
    poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
    poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
    CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
    HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(client);
    clientHttpRequestFactory.setConnectTimeout(restTemplateProps.getConnectionTimeout());
    clientHttpRequestFactory.setReadTimeout(restTemplateProps.getSocketTimeout());
    restTemplateBuilder = restTemplateBuilder.additionalInterceptors(new MyClientHttpRequestInterceptor());
    return restTemplateBuilder.requestFactory(clientHttpRequestFactory).build();
  }