改造 2.0 + GSON 无法为接口调用无参数构造函数

2022-09-04 23:46:23

我在应用中使用了 Retrofit 2.0。一切都很好,但是当我开始没有参数的请求时,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,但它不会改变任何东西。


答案 1

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

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

编辑:

我认为大多数人会偶然发现这一点的原因是,他们希望将暂停的改造响应包装在一些东西中,以便以无缝的方式处理错误。

这里有一个问题,也许改造将来会解决这个问题。我最终使用了这里提供的那种解决方案


答案 2

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

我认为您正在使用这行中的界面:

Call<ArrayList<GetPhones>> getPhones();

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


推荐