为了知足调用需求,须要在使用Resttemplate发送请求时,修改超时时长,网上给出了相关修改方法,代码以下:java
HttpComponentsClientHttpRequestFactory rf = ((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory()); rf.setConnectTimeout(30000); rf.setReadTimeout(30000);
可是在运行时报错,org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactoryspring
restTemplate.getRequestFactory()返回的类型没法转换,经过搜索和调试发现,在resttemplate中,必须在设置拦截器以前设置超时,由于在设置拦截器后没法设置超时,而我在设置中并无设置过拦截器,应该是被默认构造了,因此解决方法以下:ide
restTemplate.setInterceptors(null);
HttpComponentsClientHttpRequestFactory rf = ((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory()); rf.setConnectTimeout(30000); rf.setReadTimeout(30000);
在设置超时以前,先将拦截器置空,这样就不会出现没法设置的问题,以后验证经过。函数
查看resttemplate源码后发现,之因此会出现这样的状况是由于在resttemplate的源码中,有这么一段代码:this
/** * Return the request interceptor that this accessor uses. */ public List<ClientHttpRequestInterceptor> getInterceptors() { return interceptors; } @Override public ClientHttpRequestFactory getRequestFactory() { ClientHttpRequestFactory delegate = super.getRequestFactory(); if (!CollectionUtils.isEmpty(getInterceptors())) { return new InterceptingClientHttpRequestFactory(delegate, getInterceptors()); } else { return delegate; } }
能够看到,在getRequestFactory()函数中,原本应该是返回ClientHttpRequestFactory类型的,可是它会先校验一次是否含有interceptors拦截器,若是拦截器非空,则会返回包含拦截器的InterceptingClientHttpRequestFactory,这样是没法转换为HttpComponentsClientHttpRequestFactory类型的,所以在前面处理的时候将拦截器置空,这样就能够返回不含拦截器的所需对象。调试