使用AndroidAnnotations处理超时(Spring Rest)

Rei*_*erd 5 rest spring android spring-mvc android-annotations

基本上,我今天面临的是以下几点:

  • 处理休息操作时处理请求超时.

看起来很简单,但编码并不容易.

这是我到目前为止的实现:

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

tpl.setInterceptors( interceptors );
Run Code Online (Sandbox Code Playgroud)

所以现在,在设置拦截器之后,我想为模板设置自定义超时配置.

所以我做了以下事情: tpl.getRequestFactory().

如果没有设置拦截器,则返回a InterceptingClientHttpRequestFactory而不是SimpleClientHttpRequestFactory返回.

因此,当它返回该InterceptingClientHttpRequestFactory实例时,我无法设置超时.

您可以查看Spring的源代码,最后一种方法:http://grepcode.com/file_/repo1.maven.org/maven2/org.springframework/spring-web/3.1.1.RELEASE/org/springframework/http/客户机/支撑/ InterceptingHttpAccessor.java /?v =源

所以...任何提示?

elt*_*abo 7

假设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();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


小智 7

我看到androidannotations文档有@Rest注释

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

AppRequestFacetory.class设置TIMEOUT如下:

@EBean
class AppRequestFactory extends SimpleClientHttpRequestFactory {

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

它的工作原理.享受androidannotations rest api