java - Moshi 无法使用泛型为类创建转换器

标签 java android generics retrofit moshi

我的一些成功的服务器响应是:

{ "error": null, "data": null }

我的模型是:

public class BaseResponse<E > {

    @Json(name = "error")
    public ErrorModel error;

    @Json(name = "data")
    public E data;
}

如果我的端点是

@POST("user")
Call<BaseResponse<String>> createUser(@Body Credentials credentials);  

这行得通,但是 String 类型是无用的,因为数据总是 null。但如果我成功了:

@POST("user")
Call<BaseResponse> createUser(@Body Credentials credentials);  

我在

崩溃了
Call<BaseResponse> call = apiService.createUser(creds);

完整日志:

java.lang.IllegalArgumentException: Unable to create converter for 
    class common.model.responses.BaseResponse for method MyEndpoints.createUser
  ...
Caused by: java.lang.IllegalArgumentException: Expected a Class, ParameterizedType, 
   or GenericArrayType, but <null> is of type null
  at com.squareup.moshi.Types.getRawType(Types.java:167)
  at com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:83)
  at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:75)
  at com.squareup.moshi.Moshi.adapter(Moshi.java:100)
  at com.squareup.moshi.ClassJsonAdapter$1.createFieldBindings(ClassJsonAdapter.java:91)
  at com.squareup.moshi.ClassJsonAdapter$1.create(ClassJsonAdapter.java:75)
  at com.squareup.moshi.Moshi.adapter(Moshi.java:100)
  at retrofit2.converter.moshi.MoshiConverterFactory.responseBodyConverter(MoshiConverterFactory.java:91)
  at retrofit2.Retrofit.nextResponseBodyConverter(Retrofit.java:330)
  at retrofit2.Retrofit.responseBodyConverter(Retrofit.java:313)
  at retrofit2.ServiceMethod$Builder.createResponseConverter(ServiceMethod.java:736)
 ...

最佳答案

出现此特定错误是因为无法知道 E 字段的类型,因为它未在原始类型用法中指定。

由于您知道该字段将始终为空,因此最好的解决方案是使用不同的类型(缺少该字段)来阐明这一点。

如果您真的不能使用不同的类型,您可以使用 Void 作为通用类型参数。不过,您需要在 Moshi 实例上注册一个 JsonAdapter 才能反序列化 Void 字段:new Moshi.Builder().add(VOID_JSON_ADAPTER).build()

static final Object VOID_JSON_ADAPTER = new Object() {
  @FromJson Void fromJson(JsonReader reader) throws IOException {
    return reader.nextNull();
  }

  @ToJson void toJson(JsonWriter writer, Void v) throws IOException {
    writer.nullValue();
  }
};

但是,使用不同的类型最有意义。

关于java - Moshi 无法使用泛型为类创建转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45167706/

相关文章:

java - 使用 Prepared Statement 设置 LONG 数据类型

Java - 获取 key 失败 : java. security.InvalidKeyException : Invalid RSA private key and DerInputStream. getLength():发现冗余长度字节

android - 共享我的 Android 应用程序的 apk 有什么危害吗?

android - 如何在 Android 中为固定大小的字符串制作带有下划线的 Edittext?

swift - 从 SHA256.hash(data :)?

java - 在 Java 中安全地遍历原始迭代器?

java - 如何将自定义的jPanel多次添加到jFrame中?

java - 使用带有时区的 SimpleDateTimeFormatter 时获取错误的解析日期

android - 在Android onTouch上播放音频

JavaFx 使用反射和自定义注释创建 TableColumn : can't create instance of parameter typed class