我正在使用Android Annotations Framework,专门用于Rest Integration。 我有以下代码。
主机配置的接口
public interface Host {
public String URL = "http://192.168.2.137";
}
带注释的Interface for Rest通信。
@Rest(rootUrl = Host.URL, converters = { MappingJacksonHttpMessageConverter.class })
public interface RestClient {
@Get("/entities.json")
Entity[] allEntities();
}
我的问题是,为什么注释属性Rest.rootUrl的值必须是常量表达式?以及如何为Rest.rootUrl使用String资源?
我希望做一些像
这样的事情@EBean
public class Host{
@StringRes
String URL;
}
但是使用RestClient接口是不可能的。
想法是处理本地化的休息应用程序,假设语言不同的URL
http://en.myapp.com
http://es.myapp.com
我知道Java接口必须具有最终属性,但是,有一种方法可以处理本地化的rootUrl值吗?
感谢。
答案 0 :(得分:6)
Jon对于注释值是正确的,但Android Annotations实际上确实为您提供了一种动态设置RestClient的根URL的方法。
只需从注释中省略rootUrl属性,并向界面添加方法:
void setRootUrl(String rootUrl);
请记住,在实际使用RestClient之前,您需要在应用中的某个位置调用RestClient.setRootUrl(url)
。
https://github.com/excilys/androidannotations/wiki/Rest%20API#rest
的更多信息答案 1 :(得分:2)
为什么注释属性Rest.rootUrl的值必须是常量表达式?
这不是特别是Android问题,也不是关于那些特定注释的问题。 Java中的所有注释值必须是常量表达式 - 因为这些值在编译时被烘焙到类文件中。
当且仅当满足下列条件之一时,元素类型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是枚举常量。