2

ここからAutoValueライブラリを使用しようとしています

TypeAdapterFactoryWeb サービス呼び出しに Retrofit 2.0 を使用していますが、すべての Web サービス要求が HTTP 要求エラー 400 で失敗しました。さらに調査したところ、 を設定して Retrofit Builder に渡す必要があることがわかりました。

Retrofit retrofit = new Retrofit
    .Builder()
    .addConverterFactory(gsonConverterFactory)
    .baseUrl("http://url.com/")
    .build()

この回答は、Retrofit 2 で AutoValue を使用する方法で入手できますか?

しかし、gsonConverterFactoryそこで使われているのは

public class AutoValueGsonTypeAdapterFactory implements TypeAdapterFactory {

public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
    Class<? super T> rawType = type.getRawType();

    if (rawType.equals(SignIn.class)) {
        return (TypeAdapter<T>) SignIn.typeAdapter(gson);
    } 

    return null;
}

}

どこrawType.equals(SignIn.class)で使用されているので、私の質問は、の汎用バージョンを作成する方法はありますか、またはそれぞれの DTO を使用して Web サービス要求ごとAutoValueGsonTypeAdapterFactoryに個別に作成する必要がありますか??AutoValueGsonTypeAdapterFactory

前もって感謝します

4

1 に答える 1

0

すべての auto-value-gson クラスの TypeAdapterFactory を生成するには、TypeAdapterFactory を実装する抽象クラスを作成し、それに @GsonTypeAdapterFactory のアノテーションを付けるだけで、auto-value-gson が実装を作成します。AutoValue クラスと同様に、静的ファクトリ メソッドを提供するだけでよく、生成された TypeAdapterFactory を使用して、Gson が型をデシリアライズ/シリアル化するのに役立ちます。

gson 拡張ドキュメントから

処理する以下のファクトリ メソッドを作成します。

@GsonTypeAdapterFactory
public abstract class MyAdapterFactory implements TypeAdapterFactory {

  // Static factory method to access the package
  // private generated implementation
  public static TypeAdapterFactory create() {
    return new AutoValueGson_MyAdapterFactory();
  }

}

factory のインスタンスを登録します。

GsonConverterFactory gsonConverterFactory = GsonConverterFactory.create(
                new GsonBuilder()
                        .registerTypeAdapterFactory(AutoValueGsonTypeAdapterFactory.create())
                        .create());

そして、それをretrofitclientに次のように追加します

Retrofit retrofitClient = new Retrofit.Builder()
                .baseUrl(BuildConfig.END_POINT)
                .addConverterFactory(gsonConverterFactory)
                .client(okHttpClient.build())
                .build();
于 2016-12-23T07:11:13.020 に答える