【问题标题】:Why The value for annotation attribute Rest.rootUrl must be a constant expression?为什么注释属性 Rest.rootUrl 的值必须是常量表达式?
【发布时间】:2013-04-05 01:15:35
【问题描述】:

我正在使用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 的值必须是常量表达式?以及如何为 Rest.rootUrl 使用字符串资源?

我想做类似的事情

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: java android rest android-annotations


    【解决方案1】:

    为什么注释属性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 是枚举常量。

    【讨论】:

      【解决方案2】:

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

      只需在注解中省略rootUrl属性,在接口中添加方法即可:

      void setRootUrl(String rootUrl);
      

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

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

      【讨论】:

      • 我很确定 setRootUrl(String rootUrl) 之前 (2.7.1) 没有出现在 AndroidAnnotations 中,这似乎是一个新功能 (3),我说得对吗?非常感谢!
      • 我认为它可能已经在 2.6 中 - 添加它的拉取请求大约有一年的历史,但无论哪种方式,它现在都在那里 :)
      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多