Требуется аннотирование HTTP-аннотации модификации 2 (например, @GET, @POST и т. Д.).

Что случилось с моей настройкой «Дооснащения»? У меня возникла эта ошибка, когда я добавляю базовую проверку подлинности с помощью моего OkHttpClient, но когда я использовал клиент по умолчанию без Interceptor, он работает. Или что-то не так с моими зависимостями Грейдл ..?

E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.IllegalArgumentException : HTTP method annotation is required (eg, @GET, @POST, etc.). for method APIService.getRegAccrDetails at retrofit.Utils.methodError(Utils.java:177) at retrofit.Utils.methodError(Utils.java:167) at retrofit.RequestFactoryParser.parseMethodAnnotations(RequestFactoryParser.java:135) at retrofit.RequestFactoryParser.parse(RequestFactoryParser.java:59) at retrofit.MethodHandler.create(MethodHandler.java:30) at retrofit.Retrofit.loadMethodHandler(Retrofit.java:151) at retrofit.Retrofit$1.invoke(Retrofit.java:132) at $Proxy0.getRegAccrDetails(Native Method) at alvin.test.myapplication.MainActivity.liferayAccess(MainActivity.java:136) at alvin.test.myapplication.MainActivity.access$000(MainActivity.java:28) at alvin.test.myapplication.MainActivity$1.onClick(MainActivity.java:49) at android.view.View.performClick(View.java:3511) at android.view.View$PerformClick.run(View.java:14105) at android.os.Handler.handleCallback(Handler.java:605) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4424) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) 

Вот моя служба API, которая будет называться

  @GET("Triu-services-portlet.regaccrdetails/get-all-reg-accr-details-by-num-branch-code/num/{num}/branch-code/{branch-code}") public Observable<List<RegAccrDetails>> getRegAccrDetails(@Path("num") String num, @Path("branch-code")String branchCode); 

Мой перехватчик OkHttpClient

 private static OkHttpClient createOkHttpClient() { String username = "test@liferay.com"; String password = "TEST"; String credentials = username + ":" + password; final String basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.DEFAULT);//no_wrap OkHttpClient client = new OkHttpClient(); client.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response response = chain.proceed(chain.request()); Request original = chain.request(); // Customize the request Request request = original.newBuilder() .header("Authorization", basic) .header("Accept", "application/json") //.header("Authorization", "auth-token")//add token for service A4oslsSXZxfbLdk .method(original.method(), original.body()) .build(); response = chain.proceed(request); // Customize or return the response return response; } }); return client; } 

Вот мой призыв к моему API

 private void liferayAccess(){ Log.d("liferayAccess", "Entered"); APIService service = ServiceGenerator.createService(APIService.class); Observable<List<RegAccrDetails>> liferayResponse = service.getRegAccrDetails("004589209", "001"); liferayResponse.subscribeOn(Schedulers.newThread()).map(listResponse -> "response index 0 " + listResponse.get(0).getRegNum()) .subscribe( response-> Log.d("Liferay Num", response), error -> Log.d("Error", error.toString()) ); } 

Вот мои зависимости от Gradle

  compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'io.reactivex:rxjava:1.0.16' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' //compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta2' /*compile 'com.squareup.okhttp:okhttp:2.2.0'*/ compile ('com.squareup.retrofit2:retrofit:2.0.0-beta3') {//com.squareup.retrofit2:retrofit:2.0.0-beta3 // exclude Retrofit's OkHttp peer-dependency module and define your own module import //exclude module: 'okhttp' } compile 'com.squareup.okhttp3:okhttp:3.0.0' compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' 

Вот мой файл приложения Gradle

 apply plugin: 'com.android.application' apply plugin: 'me.tatarka.retrolambda' android { compileSdkVersion 23 buildToolsVersion "23.0.2" compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' } defaultConfig { applicationId "alvin.test.myapplication" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.1.1' compile 'io.reactivex:rxjava:1.0.16' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' //compile 'com.squareup.retrofit:converter-simplexml:2.0.0-beta2' /*compile 'com.squareup.okhttp:okhttp:2.2.0'*/ compile ('com.squareup.retrofit2:retrofit:2.0.0-beta3') {//com.squareup.retrofit2:retrofit:2.0.0-beta3 // exclude Retrofit's OkHttp peer-dependency module and define your own module import //exclude module: 'okhttp' } compile 'com.squareup.okhttp3:okhttp:3.0.0' compile 'com.squareup.okhttp3:logging-interceptor:3.0.1' //compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' compile 'com.google.android.gms:play-services-gcm:7.3.0' compile 'com.google.android.gms:play-services:7.8.0' } retrolambda { jdk "C:\\Program Files\\Java\\jdk1.8.0_20" } 

Мой Пролог. Я также попытался добавить и удалить его, но тот же самый журнал ошибок

 -keepattributes *Annotation* -keep class retrofit.** { *; } -keepclasseswithmembers class * { @retrofit.http.* <methods>; } -keepattributes Signature -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.** { *; } 

Solutions Collecting From Web of "Требуется аннотирование HTTP-аннотации модификации 2 (например, @GET, @POST и т. Д.)."

вопрос

Вы используете бета2 версии модифицированных плагинов, которые зависят от версии com.squreup.retrofit версии, которая до сих пор живет в пакете com.squreup.retrofit .

 compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' 

Затем вы импортируете бета-версию самой модификации, которая живет в пакете retrofit2. В основном он может использоваться вместе с версией бета2.

 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3' 

Вы вообще не используете beta3, потому что это несовместимо с плагинами beta2, и вы получите ошибки времени компиляции. Проверьте свой импорт для проверки.

То, что произошло (скорее всего), вы используете все из пакета com.square.retrofit , за исключением класса @GET который из пакета @GET . Несмотря на то, что они идентичны, эти классы не совпадают.

Решение

Перейдите в пакет beta4 и retrofit2. Исправьте свой импорт. Прибыль.

 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' 

Использование неправильного «@GET»

Это может помочь кому-то перейти от retrofit1, я получил ту же ошибку, и исправление было простым. В моем интерфейсе я не знал, что я использовал @GET из retrofit.http, а не @GET из retrofit2.http, меняя аннотацию с retrofit.http на retrofit2.http все, что мне нужно было сделать.

Введите описание изображения здесь

Похоже, вы используете proguard и снимаете аннотации. Чтобы сохранить его, добавьте эти строки в свой proguard-rules.pro

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

Если вы не используете proguard, убедитесь, что вы не записали что-то в своем приложении build.gradle что-то вроде этого

 buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } 

Примечание. Android по умолчанию не поставляется со многими библиотеками javax.annotation.

Если это не так, попробуйте добавить это в свою зависимость от gradle (build.gradle)

 provided 'org.glassfish:javax.annotation:10.0-b28' 

Как заявил Евгений Печанец, проблема заключается, как правило, в конфликте между модификацией и модификацией 2. В моем случае ошибка « аннотация HTTP-метода требуется @GET @POST » была вызвана использованием неправильной структуры Builder HTTPLoggingInterceptor .

Поэтому убедитесь, что вы используете okhttp3 с retrofit2

Итак, правильная структура выглядит так:

 import okhttp3.OkHttpClient; import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Retrofit; import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; ... Retrofit provideRetrofit(){ // get base url for endpoint String endpointUrl = BuildConfig.apiEndpointUrl; // add logging interceptor HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).build(); // build retrofit instance Retrofit retrofit = new Retrofit.Builder() .baseUrl(endpointUrl) .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); return retrofit; } 

И приложение / build.gradle

 compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4' compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4' compile 'com.squareup.okhttp3:logging-interceptor:3.2.0' compile 'com.squareup.okhttp3:okhttp:3.2.0'