web-dev-qa-db-ja.com

Retrofit 2 HTTPメソッドアノテーションが必要です(例:@ GET、@ POSTなど)

レトロフィット構成の何が問題になっていますか? OkHttpClientで基本認証を追加しているときにこのエラーが発生しますが、Interceptorなしでデフォルトのクライアントを使用すると機能します。または、Gradleの依存関係に問題がありますか?

E/AndroidRuntime﹕ FATAL EXCEPTION: main
        Java.lang.IllegalArgumentException
    : HTTP method annotation is required (e.g., @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 = "[email protected]";
   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'

これが私のAppGradleファイルです

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.** { *; }
13
DreamBigAlvin

問題

com.squreup.retrofitパッケージにまだ存在するレトロフィットのベータ2バージョンに依存するレトロフィットプラグインのベータ2バージョンを使用しています。

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

次に、retrofit2パッケージに含まれるレトロフィット自体のbeta3バージョンをインポートします。基本的にはbeta2バージョンと併用できます。

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

Beta3はbeta2プラグインと互換性がなく、コンパイル時にエラーが発生するため、実際にはまったく使用していません。インポートを確認して確認します。

何が起こったのかというと、(ほとんどの場合)com.square.retrofitパッケージからの@GETクラスを除いて、retrofit2パッケージからのすべてを使用します。それらの同じ名前にもかかわらず、これらのクラスは同じではありません。

解決

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'
11
Eugen Pechanec

間違った「@GET」の使用

これはretrofit1から来る誰かを助けるかもしれません、私はこれと同じエラーを受け取りました、そして修正は簡単でした。私のインターフェースでは、retrofit2.httpからの@GETではなくretrofit.httpからの@GETを使用していることに気づかず、アノテーションをretrofit.httpからretrofit2.httpに変更するだけで済みました。

enter image description here

38
Jraco11

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'
5
Harsh Sharma

Eugen Pechanecが述べたように、問題は通常、レトロフィットとレトロフィット2の競合にあります。私の場合、「HTTPメソッドアノテーションが必要です@GET @POST」というエラーは、間違った構造を使用したことが原因でした。 HTTPLoggingInterceptorのビルダー。

したがって、okhttp3retrofit2を使用していることを確認してください

したがって、正しい構造は次のようになります [〜#〜] this [〜#〜]

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;
}

そしてapp/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'
0
murt