You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot请求完成但Retrofit返回null的问题求助

问题解决:Retrofit回调返回的Customer对象id为null(数据库已插入成功)

核心原因

数据库插入成功说明后端已经生成了ID,但Retrofit接收的对象id为null,大概率是后端没有把生成的ID包含在响应中,或者前端反序列化时无法识别ID字段。

排查与修复步骤

1. 检查Spring Boot后端接口的返回逻辑

确保你的Controller在保存Customer后,返回的是数据库中刚生成的完整实体对象,而不是传入的原始对象:

@PostMapping("/api/customer/add")
public ResponseEntity<Customer> addCustomer(@RequestBody Customer customer) {
    // JPA的save方法会返回包含生成ID的实体
    Customer savedCustomer = customerRepository.save(customer);
    // 必须返回savedCustomer,而非传入的原始customer
    return ResponseEntity.ok(savedCustomer);
}

同时检查Customer实体类的ID字段配置:

import jakarta.persistence.*; // 旧版Spring用javax.persistence

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 确保是自增生成策略
    private Long id; // 类型要与数据库字段匹配,比如Integer/Int
    
    // 其他字段...
    
    // 必须提供id的getter方法(序列化框架需要通过getter获取值)
    public Long getId() {
        return id;
    }
    
    public void setId(Long id) {
        this.id = id;
    }
    
    // 其他字段的getter/setter...
}

2. 验证后端响应的JSON内容

用Postman、curl直接调用后端接口,查看返回的JSON是否包含id字段:

curl -X POST -H "Content-Type: application/json" -d '{"username":"test","password":"123","dob":"2000-01-01","firstName":"Test","lastName":"User"}' http://192.168.4.29:8102/api/customer/add

如果返回的JSON里没有id字段,说明后端未返回该字段,回到步骤1修复;如果有id字段,继续下一步。

3. 检查前端Kotlin的Customer数据类

确保Kotlin的Customer类字段和后端返回的JSON字段匹配,且id字段可空(因为传入时为null,返回时会有值):

data class Customer(
    val id: Long?, // 对应后端的Long类型,后端是Int则用Int?
    val username: String?,
    val password: String?,
    val dob: String?,
    val firstName: String?,
    val lastName: String?,
    val isActive: Boolean?
)

如果后端返回的字段名与Kotlin类不一致(比如后端是user_id,Kotlin是id),需要添加@SerializedName注解:

import com.google.gson.annotations.SerializedName

data class Customer(
    @SerializedName("user_id") // 对应后端JSON的字段名
    val id: Long?,
    // 其他字段...
)

4. 前端调试确认响应内容

在SwapItApiService的onResponse方法中打印原始响应,确认Retrofit接收到的JSON是否包含id:

override fun onResponse(call: Call<Customer>, response: Response<Customer>) {
    // 打印原始响应JSON(注意:raw().body().string()只能调用一次)
    response.raw().body?.let {
        val rawJson = it.string()
        println("后端返回JSON: $rawJson")
    }
    val customer = response.body()
    onResult(customer)
}

如果打印的JSON里有id,但customer对象的id仍为null,说明是Gson反序列化的问题,检查字段名匹配或Gson配置。

5. 额外注意点

  • 若后端用Jackson序列化、前端用Gson反序列化,需确保字段命名策略一致(比如统一用驼峰,不要混用下划线)。
  • 后端保存后不要手动将savedCustomer的id设为null,确保其为数据库生成的真实值。

内容的提问来源于stack exchange,提问作者JamieRhys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:44:58