3

我正在使用Android Annotations Framework,特别是用于 Rest 集成。我有以下代码。

主机配置界面

public interface Host {
    public String URL = "http://192.168.2.137";
}

以及用于 Rest 通信的带注释的接口。

@Rest(rootUrl = Host.URL, converters = { MappingJacksonHttpMessageConverter.class })
public interface RestClient {
    @Get("/entities.json")
    Entity[] allEntities();
}

我的问题是,为什么注释属性 Rest.rootUrl 的值必须是常量表达式?以及如何将 String 资源用于 Rest.rootUrl ?

我想做类似的事情

@EBean
public class Host{
    @StringRes
    String URL;
}

但是使用 RestClient 接口是不可能的。

这个想法是处理一个本地化的休息应用程序,假设不同的 URL 按语言

http://en.myapp.com
http://es.myapp.com

我知道 Java 接口必须具有最终属性,但是,有办法处理本地化的 rootUrl 值吗?

谢谢。

4

2 回答 2

7

Jon 关于注解值是正确的,但 Android Annotations 实际上确实为您提供了一种为 RestClient 动态设置根 url 的方法。

只需从注解中省略 rootUrl 属性,并在接口中添加一个方法:

void setRootUrl(String rootUrl);

请记住,RestClient.setRootUrl(url)在实际使用 RestClient 之前,您需要在应用程序中的某个时间点调用。

更多信息在https://github.com/excilys/androidannotations/wiki/Rest%20API#rest

于 2013-05-28T02:58:59.363 回答
2

为什么注释属性 Rest.rootUrl 的值必须是常量表达式?

这并不是一个真正的 Android 问题,也不是关于那些特定注释的问题。Java 中的所有注解值都必须是常量表达式——因为这些值在编译时被烘焙到类文件中。

JLS 第 9.7 节

当且仅当以下条件之一为真时,元素类型 T 与元素值 V 相称:

  • T 是数组类型 E[] 并且:
    • V 是 ElementValueArrayInitializer,V 中的每个 ElementValue(类似于数组初始值设定项中的 VariableInitializer)都与 E 相称;或者
    • V 是与 E 相称的 ElementValue。
  • V 的类型与 T 的赋值兼容(第 5.2 节),此外:
    • 如果 T 是原始类型或字符串,并且 V 是常量表达式(第 15.28 节)。
    • V 不为空。
    • 如果 T 是 Class,或 Class 的调用,并且 V 是类文字(第 15.8.2 节)。
    • 如果 T 是枚举类型,而 V 是枚举常量。
于 2013-04-12T13:29:09.840 回答