【问题标题】:Retrofit 2.0 + GSON Unable to invoke no-args constructor for interfaceRetrofit 2.0 + GSON 无法为接口调用无参数构造函数
【发布时间】:2016-02-18 09:35:43
【问题描述】:

我在我的应用程序中使用 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 创建无参数构造函数,但它没有改变任何东西。

【问题讨论】:

    标签: java android gson retrofit


    【解决方案1】:

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

    解决方案是在接口定义中将Call&lt;MyObject&gt;替换为MyObject,并在调用处删除?.execute()?.body()(或等效项)。

    编辑:

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

    这个located here 有一个问题,也许Retrofit 会在未来处理这个问题。我最终使用了kind solution provided here

    【讨论】:

    • 非常感谢。我面临着同样的问题。这有效!
    • 并非所有英雄都穿着斗篷。谢谢!
    • 你好 Daniel 我正在使用转换器将 Call 转换为 ResultWrapper 并且我正在使用 execute 方法,现在它是如何工作的?由于我没有执行方法
    • 你是我的英雄,朋友!
    • 我对无法访问错误处理的完整响应感到沮丧,然后我在发行说明(Retrofit 的文档不是很好)中发现返回 Response&lt;T&gt;。这似乎工作正常。
    【解决方案2】:

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

    我认为你在这一行中使用了接口:

    Call<ArrayList<GetPhones>> getPhones();
    

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

    【讨论】:

      【解决方案3】:

      这真的很有帮助。我遇到了同样的问题,它通过在我们为 API 调用请求编写函数的接口中将Call&lt;MyObject&gt; 替换为MyObject 来工作,然后在调用站点删除.enque

      【讨论】:

        猜你喜欢
        • 2018-12-29
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 2019-08-24
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 2019-05-07
        相关资源
        最近更新 更多