Java 使用HttpComponents客户端HttpRequestFactory在RestTemplateBuilder中添加自定义ClientHttpPrequestInterceptor
我需要在所有RestTemplate客户端请求中添加一个自定义头。所以我实现了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
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()
方法中,当我尝试将&typecastrequestFactory
提取到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();
}