有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java“在类上找不到字段的setter/field”

我正在Android Studio中创建一个应用程序,它连接到一个云Firestore数据库。在数据库中,我有以下结构:

Myclass
  - name = "test"
  - subclass
     - 0 = "String 1"
     - 1 = "String 2"

类本身是这样声明的(删除了不相关的位):

public class Myclass {

    private String name;
    private String[] subclass;

    // CONSTRUCTOR
    public Chart() {}

    //GETTERS
    public String getName()     { return this.name; }

    // SETTERS
    public void setSubclass(String[] thisSubclass)    { this.subclass = thisSubclass; }

}

在活动中,Myclass对象的设置如下(同样,不相关的位被删除):

public class MyclassActivity  {
    DocumentReference docRef;
    Myclass myItem;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

       // Set up database connection, read in itemId etc...
       // ...omitted for clarity...    

        docRef = databaseRef.collection("myclass").document(itemId);
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    DocumentSnapshot document = task.getResult();
                    if (document.exists()) {
                        myItem = document.toObject(Myclass.class);
                    }
                }
         }
}

这会读入Myclass对象,并正确设置名称,但子类对象没有被设置——它仍然为null

在调试控制台中有以下消息:

No setter/field for subclass found on class path.to.app.Myclass

“setSubclass”函数呈灰色,好像从未使用过一样。我肯定问题很明显,但我看不出来


共 (1) 个答案

  1. # 1 楼答案

    模型类中有两个错误。第一个是构造函数的名称,它不同于类的名称,并且应该是相同的。第二,对于subclass字段,您只定义了setter,但没有定义getter

    你的Myclass类应该是这样的:

    public class MyClass {
        private String name;
        private String[] subclass;
    
        public MyClass() {}
    
        public MyClass(String name, String[] subclass) {
            this.name = name;
            this.subclass = subclass;
        }
    
        public String getName() { return name; }
    
        public String[] getSubclass() { return subclass; }
    }
    

    不需要二传手。如果JSON属性没有setter,Firebase客户端将直接在字段上设置值,这就是为什么称为惯用。如果在代码中显式地需要它们,只需向模型类中添加以下setter,如下所示:

    public void setName(String name) { this.name = name; }
    
    public void setSubclass(String[] subclass) { this.subclass = subclass; }
    

    关于在Cloud Firestore数据库中使用数组的问题,请参见我的回答