【问题标题】:Firebase an not instantiate value of type from String valueFirebase 不是从字符串值实例化类型的值
【发布时间】:2016-03-26 03:45:21
【问题描述】:

原因:com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class net.we4x4.we4x4.userInformation] from String value;没有单字符串构造函数/工厂方法

这个错误让我很困惑,我尝试按照 firebase Docs 上提供的几条说明进行操作,例如:https://www.firebase.com/docs/android/guide/retrieving-data.html

还有一个关于查询数据的,这里还有另一个教程: https://www.simplifiedcoding.net/firebase-android-tutorial-writing-firebase-data/

我无法以适当的方式解决问题,我想做的只是从这个 JASON 获取数据:

  {
 "data" : {
"ratingPic" : 0,
"ratingVClip" : 36
 },
"users" : {
"3c42f867-8c3a-423b-89e8-3fb777ab76f8" : {
  "email" : "k@k.com",
  "username" : "kkk"
},
"50347968-cedb-4648-8025-f737fea8d4c9" : {
  "email" : "a@a.com",
  "username" : "aaa"
  }
 }
}

通过 childEventListner 的 singleValueEventListner,我仍然是同样的错误,我创建了一个单独的粗略来处理从 firebase 中提取信息:

public class userInformation {
private String email;
private String username;

public userInformation(){

}

public userInformation(String username){
    this.username = username;
}

public String getEmail() {
    return email;
}

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

public String getUsername() {
    return username;
}

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

}

这是令人困惑的部分,正如 firebase 社区上的好 ppl 所建议的那样,我不需要 setter,但是当我不在此类中放置 setter 时,我得到了错误,我只是避免得到这个类的构造错误,它只提取一个字符串,当我添加更多字符串时,我仍然得到错误,所以当我添加时:

    public userInformation(String username,  String email){
    this.username = username;
    this.email = email;
}

我得到了错误,在下面的堆栈跟踪中?

我的主要方法是:

     public void readingData() {
    Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapshot: dataSnapshot.getChildren()){
                userInformation userInformation = postSnapshot.getValue(userInformation.class);
                String username = userInformation.getUsername();
                String email = userInformation.getEmail();
                usernameDisplay.setText(email);
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            firebaseError.getMessage();
        }
    });
}

*** addChildEventListner 产生同样的错误;

     public void readingData(){
    Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
    Query queryRef = ref.orderByChild("email");
    queryRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String email) {
            // Map<String, Objects> extractedEmail = (Map<String, Objects>) dataSnapshot.getValue();
            userInformation userInformation = dataSnapshot.getValue(userInformation.class);
            email = userInformation.getEmail();
            usernameDisplay.setText(email);
        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String previousChild) {
        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChild) {
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Toast.makeText(getApplicationContext(),
                    "The read failed: " + firebaseError.getMessage(),
                    Toast.LENGTH_LONG).show();
        }
    });
} 

我为这篇冗长的帖子道歉,但我试图提供尽可能多的信息,以便帮助理解这里的混乱。

03-26 07:30:42.654 8560-8560/net.we4x4.we4x4 E/AndroidRuntime: FATAL EXCEPTION: main
  Process: net.we4x4.we4x4, PID: 8560
  com.firebase.client.FirebaseException: Failed to bounce to type
     at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
     at net.we4x4.we4x4.MainActivity$2.onDataChange(MainActivity.java:112)
     at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45)
     at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
     at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
     at android.os.Handler.handleCallback(Handler.java:733)
     at android.os.Handler.dispatchMessage(Handler.java:95)
     at android.os.Looper.loop(Looper.java:136)
     at android.app.ActivityThread.main(ActivityThread.java:5584)
     at java.lang.reflect.Method.invokeNative(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:515)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
     at dalvik.system.NativeStart.main(Native Method)
  Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class net.we4x4.we4x4.userInformation] from String value; no single-String constructor/factory method
     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:428)
     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:299)
     at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1056)
     at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:136)
     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123)
     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
     at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181)
     at net.we4x4.we4x4.MainActivity$2.onDataChange(MainActivity.java:112) 
     at com.firebase.client.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:45) 
     at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 
     at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5584) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084) 
     at dalvik.system.NativeStart.main(Native Method) 

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您正在读取单个用户对象,因此它没有子对象:

    public void readingData() {
      Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
      ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot postSnapshot: dataSnapshot.getChildren()){
                userInformation userInformation = postSnapshot.getValue(userInformation.class);
                String username = userInformation.getUsername();
                String email = userInformation.getEmail();
                usernameDisplay.setText(email);
            }
    

    这样 for 循环将迭代用户的 子属性emailusername。这些不能反序列化为userInformation 对象。

    解决办法就是不循环:

    public void readingData() {
      Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/" + UserID);
      ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            userInformation userInformation = dataSnapshot.getValue(userInformation.class);
            String username = userInformation.getUsername();
            String email = userInformation.getEmail();
            usernameDisplay.setText(email);
        }
    

    【讨论】:

    • 弗兰克,谢谢你肯定解决了 addValueEventListener 的问题,但我认为它应该与 addChildEventListener 一起工作?但是当我将相同的 userInformation 类与其他方法一起使用时,我得到了相同的错误?我添加了我在主帖中使用的方法语法
    • 如果您使用addChildEventListener,那么它将为每个孩子触发一次。在这种情况下,email 然后又是 username。这可能不是您想要的行为。建议您可能想创建一个侦听器来读取所有用户数据,而不仅仅是单个用户,因此使用以下命令备份树一个档次:Firebase ref = new Firebase("https://wi4x4.firebaseio.com/users/);",然后使用 for 循环遍历每个 user,就像您之前尝试的那样。 (如果你真的想创建一个监听器来只监控一个用户,那么你已经使用ValueEventListener。)
    猜你喜欢
    • 2023-04-07
    • 2016-08-25
    • 2016-10-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多