2014-01-30 55 views
4

基本上,我今天要面對處理超時如下:與AndroidAnnotations(彈簧安置)

  • 手柄請求超時做休息時的動作。

看起來很簡單,但不容易編碼。

這是我的執行至今:

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
interceptors.add(new NetworkInterceptor()); 

tpl.setInterceptors(interceptors); 

所以現在,設置攔截後,我想爲模板設置自定義超時配置。

所以我做了以下工作: tpl.getRequestFactory()

這是返回一個InterceptingClientHttpRequestFactory而不是SimpleClientHttpRequestFactory將返回,如果沒有設置攔截器的情況下。

因此,它正在返回InterceptingClientHttpRequestFactory實例,我無法設置超時。

您可以檢查春季的最後一個方法的源代碼:http://grepcode.com/file_/repo1.maven.org/maven2/org.springframework/spring-web/3.1.1.RELEASE/org/springframework/http/client/support/InterceptingHttpAccessor.java/?v=source

所以...任何提示?

回答

6

假設TPL是RestTemplate,你可以傳遞一個SimpleClientHttpRequestFactory作爲參數傳遞給它的構造:

List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
    interceptors.add(new NetworkInterceptor()); 

    SimpleClientHttpRequestFactory s = new SimpleClientHttpRequestFactory(); 
    s.setReadTimeout(5000); 
    s.setConnectTimeout(1000); 

    RestTemplate tpl = new RestTemplate(s);//Or however you instantiated it 
    tpl.setInterceptors(interceptors); 

    ClientHttpRequestFactory c = tpl.getRequestFactory(); 

希望它能幫助。

+0

我試過類似的東西。問題是,一旦你設置了任何攔截器,你將無法更改模板,因爲它已經修復到InterceptingClientHttpRequestFactory。 – Reinherd

+0

即使您保留對SimpleClientHttpRequestFactory的引用? InterceptingClientHttpRequestFactory保留SimpleClientHttpRequestFactory的引用,所以我認爲你可以修改超時。 – eltabo

+0

明天我會試一試。謝謝。 – Reinherd

0

當我需要配置的Android註釋REST客戶端,我用這樣的代碼:

ClientHttpRequestFactory requestFactory = restClient.getRestTemplate().getRequestFactory(); 
    if (requestFactory instanceof SimpleClientHttpRequestFactory) { 
     Log.d("HTTP", "HttpUrlConnection is used"); 
     ((SimpleClientHttpRequestFactory) requestFactory).setConnectTimeout(3 * 1000); 
     ((SimpleClientHttpRequestFactory) requestFactory).setReadTimeout(3 * 1000); 
    } else if (requestFactory instanceof HttpComponentsClientHttpRequestFactory) { 
     Log.d("HTTP", "HttpClient is used"); 
     ((HttpComponentsClientHttpRequestFactory) requestFactory).setReadTimeout(3 * 1000); 
     ((HttpComponentsClientHttpRequestFactory) requestFactory).setConnectTimeout(3 * 1000); 
    } 
5

我看到androidannotations文件有@Rest註釋

@Rest(rootUrl="yourRootUrl",requestFactory=AppRequestFacetory.class,converters ={..},interceptors={..}) 
public interface RestApis extends RestClientErrorHandling{...}; 

AppRequestFacetory.class設置超時爲如下:

@EBean 
class AppRequestFactory extends SimpleClientHttpRequestFactory { 

    @AfterInject 
    void afterinject() { 
     setReadTimeout(20*1000); //set 20s read timeout 
     setConnectTimeout(20*1000); //set 20s connect timeout 
    } 
} 

它的工作原理。享受androidannotations休息api