Resttemplate中設置超時時長方法


為了滿足調用需求,需要在使用Resttemplate發送請求時,修改超時時長,網上給出了相關修改方法,代碼如下:

HttpComponentsClientHttpRequestFactory rf =
            ((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory());
        rf.setConnectTimeout(30000);
        rf.setReadTimeout(30000);

但是在運行時報錯,org.springframework.http.client.InterceptingClientHttpRequestFactory cannot be cast to org.springframework.http.client.HttpComponentsClientHttpRequestFactory

restTemplate.getRequestFactory()返回的類型無法轉換,通過搜索和調試發現,在resttemplate中,必須在設置攔截器之前設置超時,因為在設置攔截器后無法設置超時,而我在設置中並沒有設置過攔截器,應該是被默認構造了,所以解決方法如下:

restTemplate.setInterceptors(null);
HttpComponentsClientHttpRequestFactory rf =
            ((HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory());
rf.setConnectTimeout(30000);
rf.setReadTimeout(30000);

在設置超時之前,先將攔截器置空,這樣就不會出現無法設置的問題,之后驗證通過。

查看resttemplate源碼后發現,之所以會出現這樣的情況是因為在resttemplate的源碼中,有這么一段代碼:

/**
 * 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類型的,因此在前面處理的時候將攔截器置空,這樣就可以返回不含攔截器的所需對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM