2

我正在尝试从这里使用 AutoValue 库

我使用 Retrofit 2.0 进行 Web 服务调用,所有 Web 服务请求都因 HTTP 请求错误 400 而失败。通过进一步调查,我知道我必须设置并将其TypeAdapterFactory传递给 Retrofit Builder

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

这个答案可在如何使用 AutoValue with Retrofit 2?

但是在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)使用,所以我的问题是,有没有办法制作通用版本,AutoValueGsonTypeAdapterFactory或者我必须AutoValueGsonTypeAdapterFactory使用各自的 DTO 为每个 Web 服务请求创建单独的版本?

提前致谢

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

}

注册一个工厂实例:

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

然后将其添加到改造客户端

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