Firestore:(21.4.1)[CustomClassMapper]:无设置器/字段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Firestore:(21.4.1)[CustomClassMapper]:无设置器/字段相关的知识,希望对你有一定的参考价值。

我有一个User类,可为用户节省一些额外的数据。此数据存储在Firestore中/来自Firestore。我有几个正在工作的字段(namesurnamelastLogin),但其中几个没有工作(blocked)。

当我公开该字段时,它们会起作用,但是当我尝试使用二传手时,它不会起作用。我尝试清理并重建它。我知道由于@Exclude的原因,它没有保存该字段。但是即使删除@Exclude,警告(Firestore: (21.4.1) [CustomClassMapper]: No setter/field for blocked found on class User)仍然存在。

我做错了什么?字段类型无关紧要,我添加了一个新的String字段,该字段给出了相同的警告,而namesurname起作用。

数据库:

**userid**
  
    "name" : "John",
    "surname" : "Doe",
    "lastLogin" : **timestamp**,
    "blocked" : "true"
  

班级:

@Keep
public class User

    private static User instance;

    private String name;
    private String surname;
    private Date lastLogin;
    private boolean blocked = false;

    public static User Instance()
    
         if(instance == null)
         
              instance = new User();
         

         return instance;
    

    private User()
    
    

public String getName()

    return name;


public void setName(String name)

    this.name = name;


public String getSurname()

    return surname;


public void setSurname(String surname)

    this.surname = surname;


public Date getLastLogin()

    return lastLogin;


public void setLastLogin(Date lastLogin)

    this.lastLogin = lastLogin;


@Exclude
public boolean isBlocked()

    return blocked;


public void setBlocked(boolean blocked)

    this.blocked = blocked;

答案

[尝试创建具有所有类属性的参数的构造函数以及非参数构造函数,然后在您存储在firebase中的java类中,从用户创建对象并传递它。

例如:

 package com.example.spacing.Model;

 public class User 

private String username;
private String phone;
private String id;
private String imageURL;

private String email;

public User(String username, String email ,String phone, String id, String imageURL) 
    this.username = username;
    this.email=email;
    this.phone = phone;
    this.id = id;
    this.imageURL = imageURL;


public String getImageURL() 
    return imageURL;


public String getEmail() 
    return email;


public void setEmail(String email) 
    this.email = email;


public String getId() 
    return id;


public void setId(String id) 
    this.id = id;


public User() 


public String getUsername() 
    return username;


public void setUsername(String username) 
    this.username = username;


public String getPhone() 
    return phone;


public void setPhone(String phone) 
    this.phone = phone;

   

FirebaseDatabase.getInstance().getReference("Users")

.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                                .setValue(user);
另一答案

您的代码中的问题是User类中的构造函数为私有。这不是创建类的新实例的正确方法。 JavaBeans require a no-argument constructor存在。

当Cloud Firestore SDK反序列化来自数据库的对象时,它要求所有正在使用的对象都具有此public无参数构造函数,以便它可以实例化该对象。对象中的字段是通过使用公共setter方法或直接访问公共成员来设置的,正如您已经尝试过的。

由于您的构造函数是私有的,因此SDK并不真正知道如何创建其实例。因此,必须将其更改为公开。创建该类的正确方法应该是:

public class User 
    private String username;
    private String phone;
    private String id;
    private String imageURL;
    private String email;

    public User()  //Needed for Cloud Firestore

    public User(String username, String phone, String id, String imageURL, String email) 
        this.username = username;
        this.phone = phone;
        this.id = id;
        this.imageURL = imageURL;
        this.email = email;
    

    //Getters and setters are not mandatory

还请注意,不是需要设置器和获取器。设置器始终是可选的,因为如果没有JSON属性的设置器,Firebase客户端将直接在字段上设置值。

以上是关于Firestore:(21.4.1)[CustomClassMapper]:无设置器/字段的主要内容,如果未能解决你的问题,请参考以下文章

@firebase/firestore:Firestore (8.6.5):无法访问 Cloud Firestore 后端

@firebase/firestore:Firestore (8.6.2):无法访问 Cloud Firestore 后端(React Js)

Firestore:加入与 Firestore 定价

React Native重复超时将集合写入firestore@firebase/firestore:Firestore(8.4.2):连接WebChannel传输错误

@firebase/firestore:Firestore (5.0.4):无法访问 Cloud Firestore 后端。后端在 10 秒内没有响应

Expo + firebase@9.0.1/9.0.0: @firebase/firestore:, Firestore (9.0.0): 无法到达 Cloud Firestore 后端