Method getResources没有用请求类型注释(例如,GET,POST)是什么意思?

时间:2014-03-09 22:11:34

标签: java retrofit

private interface ResourcesApi {
        @POST("/synchronize")
        void getResources(@Body Map<String, Map<String, Object>> map,
                          Callback<DataModel> callback);
    }

使用调用代码:

mApi.getResources(data, this);

该类实现了Callback,因此定义了成功/失败。

堆栈跟踪:

03-09 18:05:15.182  28570-28746/? E/AndroidRuntime﹕ FATAL EXCEPTION: pool-2-thread-1
    java.lang.IllegalStateException: Method getResources not annotated with request type (e.g., GET, POST).
            at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:179)
            at retrofit.RestMethodInfo.init(RestMethodInfo.java:115)
            at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:327)
            at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:262)
            at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:313)
            at retrofit.CallbackRunnable.run(CallbackRunnable.java:38)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
            at java.lang.Thread.run(Thread.java:856)

3 个答案:

答案 0 :(得分:5)

这意味着在运行时无法找到@POST注释。如果没有HTTP方法类型(以及它包含的相对URL),Retrofit就无法发出请求。

您使用Proguard或其他工具来修剪“未使用”的代码吗?如果是这样,请指示它保留Retrofit的注释。

答案 1 :(得分:5)

除了Jake的答案之外,我还必须添加到proguard文件中才能使其正常工作:

-keep class com.google.gson.** { *; }
-keep class com.google.inject.** { *; }
-keep class org.apache.http.** { *; }
-keep class org.apache.james.mime4j.** { *; }
-keep class javax.inject.** { *; }
-keep class retrofit.** { *; }

答案 2 :(得分:0)

同意@ chad的回答,如果仍然崩溃,请添加以下行。

-keepattributes Signature
-keep class sun.misc.Unsafe { *; }