【问题标题】:Retrofit Moshi Unable to create @Body converter for java.util.HashMap改造 Moshi 无法为 java.util.HashMap 创建@Body 转换器
【发布时间】:2021-05-13 09:40:38
【问题描述】:

EarthlingsApi.retrofitService.register(params)

在我下面的代码中

fun clickLogin(){
    val params = HashMap<String, String>()
    params["email"] = email
    params["idToken"] = idToken
    viewModelScope.launch {
        try {
            val userRegisterResult = EarthlingsApi.retrofitService.register(params)
        } catch (e: Exception) {
            Timber.d("exception? " + e.toString())
            _response.value = "Failure: ${e.message}"
        }
    }
}

总是会返回错误exception? java.lang.IllegalArgumentException: Unable to create @Body converter for java.util.HashMap&lt;java.lang.String, java.lang.String&gt; (parameter #1) for method ApiService.register

下面是EarthlingsApi的代码

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()
private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
    .build()

interface ApiService {
    @POST("/user/register")
    suspend fun register(@Body params: HashMap<String, String>?): UserRegister?
}

object EarthlingsApi {
    val retrofitService : ApiService by lazy {retrofit.create(ApiService::class.java) }
}

以前我使用 Gson 并且从未遇到过此错误。在使用 Moshi 时我还有什么需要做的吗?

【问题讨论】:

    标签: android retrofit kotlin-coroutines moshi


    【解决方案1】:

    似乎 Moshi 支持声明为 Map 但不支持声明为 HashMap 的字段。所以只需将suspend fun register(@Body params: HashMap&lt;String, String&gt;?): UserRegister? 中的HashMap 更改为Map 即可。这个answer 帮助我解决了这个问题,但不幸的是,那里的提问者没有将其标记为答案。所以也许以后遇到同样问题的任何人都可以在那里投票。

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2020-03-12
      • 2019-07-25
      • 2021-11-22
      • 1970-01-01
      • 2017-12-23
      • 2021-06-12
      • 2018-10-19
      • 1970-01-01
      相关资源
      最近更新 更多