发布带有 Retrofit2 问题的自定义对象
POSTING a custom object with Retrofit2 issue
我目前正在为一个项目制作我的第一个自定义 Android 应用程序,但我无法解决以下问题。 (我做了很多研究,但没有找到这样的东西)
2020-02-15 11:41:30.075 10337-10337/com.example.quickmatch I/SigninFragmentViewModel: Required value 'surname' missing at $post
我正在尝试将此自定义对象 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"
这是我的 Retrofit 实例:
/* 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 )
我使用基本 binding.editText.text.toString()
从 EditTexts 获取非空值
最大的问题是我在请求之前的 ViewModel 中和触发 ViewModel 的按钮 onClickListener
中的 UI 中记录了每个值(姓名、姓氏等),一切看起来都很好并匹配我在编辑中键入的内容,但是当应用 posts 时,对象的每个属性似乎都设置为 null。由于 surname
不可为空,因此我得到了先前的错误。我试图让它可以为空,这与下一个属性的问题相同。
另请注意,传递每个属性为 null 的对象都有效。
我发现指定 use-site targets 对 Kotlin 数据 class 中的字段很有帮助。
如果您尝试将注释修改为以下格式,会发生什么情况?
@field:Json(name = "surname") val surname : String
我终于解决了这个问题。问题是由 phone_number
字段创建的,我希望它是可选的。事实上,当发布时相应的 EditText 为空时,值没有被放入 null
而是 "empty"(不仅仅是“”),这解释了解析错误。所以我只是添加了一个条件,如果未填充 EditText,则将此字段设置为 null
。
我目前正在为一个项目制作我的第一个自定义 Android 应用程序,但我无法解决以下问题。 (我做了很多研究,但没有找到这样的东西)
2020-02-15 11:41:30.075 10337-10337/com.example.quickmatch I/SigninFragmentViewModel: Required value 'surname' missing at $post
我正在尝试将此自定义对象 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"
这是我的 Retrofit 实例:
/* 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 )
我使用基本 binding.editText.text.toString()
从 EditTexts 获取非空值
最大的问题是我在请求之前的 ViewModel 中和触发 ViewModel 的按钮 onClickListener
中的 UI 中记录了每个值(姓名、姓氏等),一切看起来都很好并匹配我在编辑中键入的内容,但是当应用 posts 时,对象的每个属性似乎都设置为 null。由于 surname
不可为空,因此我得到了先前的错误。我试图让它可以为空,这与下一个属性的问题相同。
另请注意,传递每个属性为 null 的对象都有效。
我发现指定 use-site targets 对 Kotlin 数据 class 中的字段很有帮助。
如果您尝试将注释修改为以下格式,会发生什么情况?
@field:Json(name = "surname") val surname : String
我终于解决了这个问题。问题是由 phone_number
字段创建的,我希望它是可选的。事实上,当发布时相应的 EditText 为空时,值没有被放入 null
而是 "empty"(不仅仅是“”),这解释了解析错误。所以我只是添加了一个条件,如果未填充 EditText,则将此字段设置为 null
。