【问题标题】:POSTING a custom object with Retrofit2 issue发布带有 Retrofit2 问题的自定义对象
【发布时间】:2020-02-15 11:15:30
【问题描述】:

我目前正在为一个项目制作我的第一个自定义 Android 应用,但我无法解决以下问题。 (我做了很多研究,但没有找到类似的东西)

2020-02-15 11:41:30.075 10337-10337/com.example.quickmatch I/SigninFragmentViewModel: Required value 'surname' missing at $post 

我正在尝试将此自定义对象在线发布到我的后端服务器:

@JsonClass(generateAdapter = true)
data class PlayerObject(
        val id : Int?,
        @Json(name = "surname") val surname : String,
        @Json(name = "first_name") val firstName : String,
        val pseudo : String,
        @Json(name = "mdp") val password : String,
        @Json(name = "mail_address") val mailAddress : String,
        @Json(name = "phone_number") val phoneNumber : String?,
        @Json(name = "scored_goals") val scoredGoals : Int,
        @Json(name = "conceded_goals") val concededGoals : Int,
        @Json(name = "matches_played") val matchesPlayed : Int,
        val victories : Int,
        val avatar : String?,
        val bio : String?
)

我将 Retrofit2 和 Moshi 与协程一起使用:

implementation "com.squareup.retrofit2:retrofit:2.5.0"
implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2"
implementation "com.squareup.retrofit2:converter-moshi:2.5.0"

这是我的改造实例:

/* Create Moshi object which will parse the responses */
private val moshi = Moshi.Builder()
        .add(KotlinJsonAdapterFactory())
        .build()

/* Retrofit builder with converter for response and base url */
private val retrofit = Retrofit.Builder()
        .addConverterFactory(MoshiConverterFactory.create(moshi))
        .addCallAdapterFactory(CoroutineCallAdapterFactory())
        .baseUrl(BASE_URL)
        .build()

为了发送我的 POST 请求,我使用了这个方法(如果成功,它应该将创建的播放器发回给我):

@POST("...")
fun addPlayer(@Body player: PlayerObject) : Deferred<PlayerObject>

我称之为传递这个对象:

var newPlayerObject = PlayerObject(null, name, firstName, pseudo, password, mailAddress, phoneNumber, 0, 0, 0, 0, null, null )

我从 EditTexts 获取非空值,基本 binding.editText.text.toString() 最大的问题是,我在请求之前的 ViewModel 和 UI 中的按钮 onClickListener 中记录了每个值(姓名、姓氏等),这会触发 ViewModel,一切看起来都很好,并且与我输入的内容相匹配编辑,但当应用程序发布时,似乎对象的每个属性都设置为空。由于surname 不可为空,我得到了上一个错误。我试图使它可以为空,下一个属性也是同样的问题。 另请注意,传递每个属性为 null 的对象是有效的。

【问题讨论】:

    标签: android post kotlin retrofit2 moshi


    【解决方案1】:

    我发现指定 use-site targets 对 Kotlin 数据类中的字段很有帮助。

    如果您尝试将注释修改为以下格式会怎样?

    @field:Json(name = "surname") val surname : String

    【讨论】:

    • 嗨,我试过了,但不幸的是我仍然遇到同样的问题
    • 您能否共享构建 Retrofit/OkHttp 实例的代码行?
    • Retrofit 从 v2.6.0 开始支持协程。您是否要将依赖项更新到最新的 v2.7.1?那么,你也根本不需要 Jake 的retrofit2-kotlin-coroutines-adapter
    • 嗨,我通过删除调用适配器依赖项、在任何地方删除 Deferred 并在我的 API 函数之前添加 suspend 来更改我的代码以使用 Retrofit2 2.6.0 更新(现在是 2.7.1) .它和以前一样工作,我仍然有缺少所需值的错误
    【解决方案2】:

    我终于解决了这个问题。问题是由我希望是可选的phone_number 字段造成的。实际上,当发布时相应的 EditText 为空时,该值并未放入 null 而是一些“空”(不仅仅是“”),这解释了解析错误。所以我只是添加了一个条件,如果 EditText 未填写,则将此字段设置为 null

    【讨论】:

      猜你喜欢
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多