Firebase数据推送时属性重复问题求助(Java模型类)
解决Firebase同时序列化
like_number和likeCount的问题 这个问题的核心是Firebase Realtime Database的Java序列化机制:它会同时处理类的字段和getter/setter方法对应的属性,当你只给字段加@PropertyName注解但没给对应的getter/setter同步注解时,就会出现重复的属性。
具体原因分析
你的父类NewsFeedItem中,likeCount字段标注了@PropertyName("like_number"),但对应的getLikeCount()方法没有加这个注解。Firebase会:
- 把带注解的字段序列化为
like_number - 同时把
getLikeCount()解析为默认的likeCount属性(遵循JavaBean命名规范,getXxx对应xxx)
最终就导致Firebase里同时出现两个重复属性。
解决方案:给getter/setter同步添加@PropertyName注解
你需要给父类中所有带@PropertyName的字段对应的getter和setter都加上相同的注解,确保Firebase把字段和方法映射到同一个属性名。
修改后的NewsFeedItem关键代码如下:
public class NewsFeedItem { @PropertyName("like_number") protected int likeCount = 0; @PropertyName("time") protected long timestamp; // 其他字段保持不变... // 给getLikeCount和setLikeCount添加对应注解 @PropertyName("like_number") public int getLikeCount() { return likeCount; } @PropertyName("like_number") public void setLikeCount(int likeCount) { this.likeCount = likeCount; } // 给timestamp的getter/setter同步添加注解 @PropertyName("time") public long getTimestamp() { return timestamp; } @PropertyName("time") public void setTimestamp(long timestamp) { this.timestamp = timestamp; } // 其他字段的getter/setter同理,确保注解和字段一致 }
额外优化建议
如果你想从根源避免这种字段和方法注解不一致的问题,可以把父类的字段改为private,只通过getter/setter暴露属性,然后只在getter/setter上添加@PropertyName注解。这样Firebase只会序列化方法对应的属性,不会处理私有字段:
public class NewsFeedItem { private int likeCount = 0; private long timestamp; // 其他私有字段... @PropertyName("like_number") public int getLikeCount() { return likeCount; } @PropertyName("like_number") public void setLikeCount(int likeCount) { this.likeCount = likeCount; } @PropertyName("time") public long getTimestamp() { return timestamp; } @PropertyName("time") public void setTimestamp(long timestamp) { this.timestamp = timestamp; } }
这样修改后,再推送Status对象到Firebase,就只会出现你指定的属性名,不会有重复的字段名了。
内容的提问来源于stack exchange,提问作者nhoxbypass
相关产品推荐
相关产品推荐

