Android中使用Retrofit GET请求获取Desk实体主键desk_id始终返回0的问题排查
你遇到的问题核心是API端序列化字段名和Android端反序列化字段名不匹配,导致desk_id始终被赋值为Int的默认值0。
问题根源
API端的DeskModel类中,主键字段是desk_id,但它的getter方法是getId()。大多数JSON序列化库(比如Retrofit默认使用的Gson)遵循JavaBean规范:将getter方法去掉get前缀、首字母小写后作为序列化后的字段名。所以getId()会被序列化为"id": xxx,而你的Android端数据类Desk中定义的是desk_id,两者名称不匹配,导致Retrofit无法将API返回的主键值赋值给desk_id,最终只能用Int的默认值0填充。
三种可行解决方案
方案1:在API端实体类字段上添加序列化注解
直接在desk_id字段上添加@JsonProperty注解,强制指定序列化后的字段名为desk_id,这样不管getter方法名称是什么,JSON输出都会使用正确的字段名:
@Entity @Table(name = "desk") public class DeskModel { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @JsonProperty("desk_id") // 添加这个注解 int desk_id; // 其余字段和方法保持不变 }
方案2:修改API端的getter/setter方法名称,匹配字段名
将getId()和setId()修改为与字段名对应的getDesk_id()和setDesk_id()(或者更符合驼峰规范的getDeskId()/setDeskId(),同时用@JsonProperty指定字段名):
// 直接匹配字段名的写法 public int getDesk_id() { return desk_id; } public void setDesk_id(int desk_id) { this.desk_id = desk_id; } // 驼峰风格+注解的写法(更规范) @JsonProperty("desk_id") public int getDeskId() { return desk_id; } @JsonProperty("desk_id") public void setDeskId(int desk_id) { this.desk_id = desk_id; }
方案3:修改Android端数据类的字段名,匹配API序列化后的字段
如果不想改动API端代码,可以把Android端Desk类的desk_id改为id,匹配API返回的JSON字段名:
data class Desk( var id : Int, var ordinal_number : Int, var available : Int )
之后获取主键时就用desk.id即可。
验证步骤
建议先通过Postman或浏览器调用你的fetchAllDesks接口,查看返回的JSON数据中主键字段是id还是desk_id,这能快速确认我们的分析是否正确。比如如果返回的是{"id":1, "ordinal_number":2, "available":1},就说明确实是序列化字段名的问题。
内容的提问来源于stack exchange,提问作者Dipsy




