我遇到了一个问题,其中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
变量确实为空,requestType
为SIMPLE
。如果我将@FormUrlEncoded
注释添加到我的测试方法中,requestType
仍设置为SIMPLE
。
关于可能导致这种情况的任何想法?
答案 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;