数据库更新操作执行成功但返回值为Null,求分析Kotlin代码问题
排查:数据库更新成功但返回Null的问题
嘿,我之前帮好几个开发者排查过类似的问题——系统提示更新成功但返回Null,大概率是前端传参或者后端响应的问题,咱们对着你的代码一步步捋:
API请求未携带更新参数(最可能的原因)
你创建了EditSwitch实例并设置了assignedTo、salesmanId这些更新字段,但你的API调用API.getEditCustomerProspect(custID)看起来只传了custID,完全没把这个EditSwitch对象传进去啊!后端可能因为没收到更新数据,虽然返回了成功状态,但没有可返回的更新后数据,所以给了Null。
你需要检查Retrofit接口定义,应该是一个带请求体的PUT/POST请求,比如:// 正确的API接口定义示例 @PUT("customers/{id}") fun getEditCustomerProspect( @Path("id") custID: String, @Body editSwitch: EditSwitch ): Call<EditSwitch>然后调用的时候要把
editSwitch传进去:API.getEditCustomerProspect(custID, editSwitch).enqueue(...)后端接口的返回逻辑问题
即使前端传对了参数,后端可能存在:- 更新操作执行成功,但没有正确返回更新后的实体对象,而是直接返回了Null
- 接口的响应体结构和前端
EditSwitch类的字段不匹配,导致Gson/Moshi等解析器无法解析,最终返回Null
建议用Postman或Charles直接调用后端接口,模拟传递正确的参数,看看返回的响应内容到底是什么。
Retrofit回调的
onResponse处理不完整
你的代码里onRespo...截断了,要确认你在onResponse里是否正确处理了响应:- 必须检查
response.isSuccessful是否为true - 即使状态码成功,也要确认
response.body()是否为Null,同时查看response.errorBody()有没有隐藏的错误信息
示例处理代码:
override fun onResponse(call: Call<EditSwitch>, response: Response<EditSwitch>) { progressDialog.dismiss() if (response.isSuccessful) { val updatedSwitch = response.body() if (updatedSwitch == null) { // 打日志排查响应细节 Log.d("EditCustomer", "Response body is null, raw response: ${response.raw()}") } else { // 处理成功更新的逻辑 } } else { // 处理错误状态码 Log.e("EditCustomer", "Update failed with code: ${response.code()}") } } override fun onFailure(call: Call<EditSwitch>, t: Throwable) { progressDialog.dismiss() Log.e("EditCustomer", "Request failed", t) }- 必须检查
custID为空的潜在问题
你从activity.intent.getStringExtra(ID_CUSTOMER_PROSPECT)获取custID,如果这个值为空,后端可能执行了一个无意义的更新(比如更新不存在的记录),但返回了成功状态,导致返回Null。建议先做非空校验:val custID = activity.intent.getStringExtra(ID_CUSTOMER_PROSPECT) ?: run { progressDialog.dismiss() Toast.makeText(activity, "Invalid customer ID", Toast.LENGTH_SHORT).show() return }
内容的提问来源于stack exchange,提问作者Ratri
相关产品推荐
相关产品推荐

