2014-01-30 5 views
4

В общем, что я сталкиваюсь сегодня является следующее:Обработка тайм-аут с AndroidAnnotations (весна отдых)

  • Handle Время ожидания запроса при выполнении Rest действия.

Похоже на простой, но не простой код.

Это моя реализация до сих пор:

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

So ... Любые советы?

ответ

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

Я пробовал что-то подобное. Проблема в том, что после того, как вы установили какой-либо перехватчик, вы не сможете изменить шаблон, поскольку он зафиксировал nw до InterceptingClientHttpRequestFactory. – Reinherd

+0

Даже если вы сохраняете ссылку на свой SimpleClientHttpRequestFactory? InterceptingClientHttpRequestFactory сохраняет ссылку на SimpleClientHttpRequestFactory, поэтому я думаю, что вы можете изменить таймауты. – eltabo

+0

Завтра я попробую. Благодарю. – Reinherd

0

Когда мне нужно настроить Android аннотаций отдыха клиента я использовал такой код:

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 набор таймаута belows:

@EBean 
class AppRequestFactory extends SimpleClientHttpRequestFactory { 

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

и он работает. enjoy androidannotations rest api

Смежные вопросы