爲了知足調用需求,須要在使用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類型的,所以在前面處理的時候將攔截器置空,這樣就能夠返回不含攔截器的所需對象。調試