无法为Retrofit2.Call调用无参数构造函数

时间:2019-10-17 09:38:50

标签: kotlin retrofit

我有以下改装单例:

interface MyAPI
{
    @GET("/data.json")
    suspend fun fetchData() : Call<MyResponse>

    companion object
    {
        private val BASE_URL = "http://10.0.2.2:8080/"

        fun create(): MyAPI
        {
            val gson = GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .create()

            val retrofit = Retrofit.Builder()
                .addConverterFactory( GsonConverterFactory.create( gson ) )
                .baseUrl( BASE_URL )
                .build()

            return retrofit.create( MyAPI::class.java )
        }
    }
}

MyResponse.kt

data class MyResponse(
    val listOfData: List<DataEntity>
)

DataEntity.kt

data class DataEntity(
    @SerializedName("name")
    val fullName: String
}

我通过以下方式从ModelView调用代码:

viewModelScope.launch {
    try {
        val webResponse = MyAPI.create().fetchData().await()
        Log.d( tag, webResponse.toString() )
    }
    catch ( e : Exception )
    {
        Log.d( tag, "Exception: " + e.message )
    }
}

但我不断得到:

Unable to invoke no-args constructor for retrofit2.Call<com.host.myproject.net.response.MyResponse>. Registering an InstanceCreator with Gson for this type may fix this problem.

我似乎无法找到解决此问题的方法。

编辑:

JSON响应:

[
    {
    "name": "A"
    },
    {
    "name": "B"
    },
    {
    "name": "C"
    }
]

3 个答案:

答案 0 :(得分:2)

问题是您尝试将suspend与返回类型Call<T>组合在一起。使用suspend时,应使Retrofit函数直接返回数据,如下所示:

suspend fun fetchData() : List<DataEntity> // Note: Not MyResponse, see below

那么您要做的就是在拨打电话时删除.await(),就像这样:

// Will throw exception unless HTTP 2xx is returned
val webResponse = MyAPI.create().fetchData()

请注意,由于JSON直接返回数组,因此根本不应该使用MyResponse类。

答案 1 :(得分:0)

第1步:删除通话并处理回复

之前:

@POST("list")
    suspend fun requestList(@Body body: JsonObject): call<Profile>

之后

@POST("list")
    suspend fun requestList(@Body body: JsonObject): Profile

第2步:删除暂停并处理响应

 @POST("list")
     fun requestList(@Body body: JsonObject): call<Profile>

答案 2 :(得分:0)

除了@Enselic的回答, 如果要获取响应(用于错误处理等),则可以返回Retrofit2的 Response 类,而不是直接返回数据。 例如,

@POST("/api/news")
@CheckResult
suspend fun getNewsList(
    @Body newsRequest: NewsRequest
): Response<NewsResponse>