Retrofit 2.0 + GSON无法为接口调用no-args构造函数

时间:2015-11-17 05:24:04

标签: java android gson retrofit

我在我的应用中使用了Retrofit 2.0。一切都很好,但当我开始请求没有args时,GSON返回:

Unable to invoke no-args constructor for interface
com.example.project.API.GetPhones. Register an InstanceCreator
with Gson for this type may fix this problem.

这是我的API界面:

public interface GetPhones {
    @GET("phones.php")
    Call<ArrayList<GetPhones>> getPhones();
}

和模型类:

public class GetPhones {
    int id;
    char[] iso;
    String name;
    String phone_1;
    String phone_2;
    String phone_3;
}

和片段中的代码:

Retrofit retrofit = new Retrofit.Builder()
         .baseUrl(URL_API)
         .client(SSLSuppressClient.trustcert())
         .addConverterFactory(GsonConverterFactory.create())
         .build();
GetPhones getPhonesInfo = retrofit.create(GetPhones.class);
Call<GetPhones> call = getPhonesInfo.getPhones();
call.enqueue(new Callback<GetPhones>() {
    @Override
    public void onResponse(Response<GetPhones> response, Retrofit retrofit) {
        Toast.makeText(getActivity(), "Success!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Throwable t) {
        Toast.makeText(getActivity(), "Failure!", Toast.LENGTH_SHORT).show();
        Log.d("LOG", t.getMessage());
                }
    });

我试图为GetPhones.class制作no-args构造函数,但它并没有改变任何东西。

2 个答案:

答案 0 :(得分:17)

如果2019年有人遇到此问题并正在使用Kotlin,协程和至少Retrofit 2.6.0,则在api方法为Call<MyObject>的情况下返回suspended实例,则会产生相同的错误消息,有点令人困惑。

解决方案是在接口定义中将Call<MyObject>替换为MyObject,并在呼叫站点删除?.execute()?.body()(或等效名称)。

编辑:

我认为大多数人会偶然发现这一点的原因是,他们希望将暂停的翻新响应包装成某种形式,以无缝地处理错误。

located here上有一个问题,也许Retrofit将来会解决。我最终使用了kind solution provided here

答案 1 :(得分:2)

接口(interface GetPhones)和模型类(class GetPhones)的名称相同。

我认为你在这一行使用界面:

Call<ArrayList<GetPhones>> getPhones();

但它应该是你的模特课。检查导入部分或重命名模型类,以确保没有混合它。