在Android上的Scala代码中改进HTTP报告“HTTP方法注释是必需的”

时间:2014-07-18 17:42:48

标签: java android scala retrofit

我遇到了一个问题,其中Retrofit库正在识别方法而不是它的注释。它报告了上面标题中的错误消息。

(背景:我正在使用SBT与sbt-android-plugin和Retrofit 1.6.1)

我的代码是这样的:

private trait MyService {
    @GET("/api/test")
    def test(): Observable[Any]
}

object MyService {
    private val restAdapter = new RestAdapter.Builder().setEndpoint("http://somewhere").build()
    val service = restAdapter.create(classOf[MyService])

    service.test().subscribe(/* you get the idea */) // This line throws a RuntimeException with message in title above
}

GitHub周围散布着一个非常类似的例子,显然来自Reactive原则课程,例如: here。我只想说,我的设置是一样的。

当我单步执行RestMethodInfo.parseMethodAnnotations()时,requestMethod变量确实为空,requestTypeSIMPLE。如果我将@FormUrlEncoded注释添加到我的测试方法中,requestType仍设置为SIMPLE

关于可能导致这种情况的任何想法?

2 个答案:

答案 0 :(得分:5)

原来Proguard正在剥离注释。

GitHub issue中的建议很有帮助:

-keepattributes *Annotation*
-keep class retrofit.** { *; }
-keepclasseswithmembers class * {
@retrofit.http.* <methods>; }
-keepattributes Signature

SO post中也提到了这个问题。

答案 1 :(得分:3)

在改造中:2.0.0库需要使用retrofit2

中的注释
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;

而不是retrofit

import retrofit.http.Field;
import retrofit.http.FormUrlEncoded;
import retrofit.http.GET;