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

时间:2013-04-12 13:24:10

标签: java android rest android-annotations

我正在使用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值吗?

感谢。

2 个答案:

答案 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中的所有注释值必须是常量表达式 - 因为这些值在编译时被烘焙到类文件

来自JLS section 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是枚举常量。
    •   
  •