Firebase Firestore中@PropertyName注解字段映射失效问题排查
Firestore使用@PropertyName注解后POJO字段映射为空问题解决
尝试从Firebase Firestore获取数据时,因POJO字段名与Firestore字段名不一致,使用了@PropertyName("Email")等注解,但Firestore映射器未正确映射字段——日志显示已成功获取数据,但POJO的email和password字段为空。
相关代码
GmailCredentials.java
public class GmailCredentials { private String email; private String password; public GmailCredentials() { } @PropertyName("Email") public String getEmail() { return email; } @PropertyName("Password") public String getPassword() { return password; } @PropertyName("Email") public void setEmail(String email) { this.email = email; } @PropertyName("Password") public void setPassword(String password) { this.password = password; } }
Kotlin读取数据代码
val taskFirebae = Firebase.firestore.collection("AppSettings").document("jt86iH0kJyNhOHftv7DF").get() val result = Tasks.await(taskFirebae) val gmailCredentials = result.toObject(GmailCredentials::class.java) if (BuildConfig.DEBUG){ Log.d(TAG," ${result.data?.toString()}") Log.d(TAG,"emil ${gmailCredentials?.email}") Log.d(TAG,"password ${gmailCredentials?.password}") }
问题原因及解决方案
核心原因
Firestore的字段映射是大小写敏感的,且注解标注位置不当、字段名不匹配等情况会导致映射失败。
修复方案
- 调整注解标注位置(推荐)
将@PropertyName直接标注在类的字段上,无需在getter/setter上重复添加,映射逻辑更清晰,避免方法注解带来的匹配问题:
public class GmailCredentials { @PropertyName("Email") private String email; @PropertyName("Password") private String password; public GmailCredentials() { } public String getEmail() { return email; } public String getPassword() { return password; } public void setEmail(String email) { this.email = email; } public void setPassword(String password) { this.password = password; } }
验证字段名匹配
检查Firestore文档中的字段名是否与@PropertyName的参数完全一致(比如确认是Email而非email,Password而非password),日志中result.data?.toString()的输出可直接验证这一点。更新Firestore SDK
确保使用的Firestore SDK为最新稳定版,旧版本可能存在注解映射的兼容性bug。调整字段访问权限(可选)
若上述方案无效,可尝试将POJO的字段改为public修饰符,确保Firestore的反射机制能正常访问字段内容。
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

