改造寻找不存在的参数?

Retrofit looking for non-existent param?

我正在使用改造在我的简单 API 调用中生成 POST 请求:

interface IRetrofitCommService {

@POST("pushnotifications/{entityId}")
suspend fun getNotificationsAsync(
    @Path("entityId") entityId: Long,
    @Body model: GetNotificationsDto
): Response<List<NotificationData>>


@POST("pushnotifications")
suspend fun registerDeviceAsync(@Body model: RegisterEntityDto):
        Response<RegisterEntityResultDto>
}

注意,在第二次调用中,我只有1个参数,用@Body注释标记。 然而,当我尝试使用网络调用时,我得到了这个异常:No annotation found for param 2

这是我创建调用的工厂:

object RetrofitFactory {
  const val BASE_URL = "https://localhost:5051/api/"

  fun createService(): IRetrofitCommService {
      return Retrofit.Builder()
          .baseUrl(BASE_URL)
          .addConverterFactory(GsonConverterFactory.create())
          .build()
          .create(IRetrofitCommService::class.java)
  }
}

这是有问题的 DTO:

data class RegisterEntityDto(val name: String, val eventType: Short, val clientId: String)

那为什么要找第二个参数呢?我错过了什么?

我对 Retrofit 不是很熟悉,我在这里做了一个有根据的猜测,但在评论中进行了简短的讨论后,我的理解似乎是正确的。

在内部,Kotlin 中的 suspend 函数接收额外的 Continuation 参数。它始终是最后一个参数,并且在 Kotlin 代码中是隐藏的。但是,如果我们查看生成的字节码,我们会看到 registerDeviceAsync() 函数实际上接收 2 个参数。

如果我们使用的某些工具不了解挂起函数,它将无法正确解释此附加参数。它只会“认为”registerDeviceAsync() 有两个参数。 Retrofit 在版本 2.6.0 中添加了对挂起功能的支持,所以我想如果使用带有挂起功能的旧版本,我们将得到您所面临的行为。

您只需要将 Retrofit 更新到较新的版本。