Android Firebase setValue报isChangingConfigurations getter冲突
异常产生原因
执行setValue()时抛出Found conflicting getters for name: isChangingConfigurations异常的核心逻辑是:Firebase实时数据库内置的对象序列化工具CustomClassMapper会扫描待写入对象的所有public getter方法,把符合JavaBean规范的属性自动转成数据库可存储的键值对;当扫描到同名的冲突getter(比如同一个属性名同时存在getXxx和isXxx两种getter,或者扫描到不属于数据实体本身的系统类getter)时,就会抛出该异常。
你之前按照其他方案修复未生效,是因为没有定位到根因:isChangingConfigurations()是Android系统Activity类自带的方法,你的User类要么错误继承了AppCompatActivity/Activity等Android系统组件,要么是Activity的非静态内部类持有了外部Activity实例,导致序列化时把Activity类的方法也纳入了扫描范围,触发冲突。
修复步骤
- 检查
User类的声明,必须满足以下要求:- 不能继承任何Android系统类(包括但不限于AppCompatActivity、Activity、View、Context相关子类),仅需继承默认的Object类即可
- 不能是SignupActivity的非静态内部类,必须是独立的public顶级类,或者是加了
static修饰的静态内部类(非静态内部类会持有外部Activity引用,序列化时同样会扫描到Activity的方法触发报错) - 必须提供无参public构造方法,待写入数据库的字段需要对应public的getter/setter,或者直接用public修饰字段
- 参考如下正确的User类实现修改你的代码:
public class User { private String id; private String username; private String email; private String password; // Firebase序列化必须的无参构造 public User() {} public User(String username, String email, String password) { this.username = username; this.email = email; this.password = password; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
- 修正数据库写入路径逻辑,你当前代码把用户数据直接写到数据库根节点,容易造成数据结构混乱,建议使用你提前定义的
USER常量统一存放用户数据,同时补全原代码缺失的页面跳转逻辑:
public void updateUI (FirebaseUser currentU) { String keyID = mDataBase.child(USER).push().getKey(); u.setId(keyID); assert keyID != null; mDataBase.child(USER).child(keyID).setValue(u); Intent login = new Intent(this, LoginScreen.class); // 原代码只创建了Intent没执行跳转,需要补充 startActivity(login); finish(); // 关闭注册页避免用户按返回键回到当前页 }
- 修改完成后重新编译运行即可,只要传入
setValue()的是符合规则的纯POJO User对象,这个getter冲突异常会直接消失。
内容的提问来源于stack exchange,提问作者Gu5t4v
相关产品推荐
相关产品推荐

