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
相关产品推荐
相关产品推荐

