You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动