FirebaseException:无法弹回类型

FirebaseException: Failed to bounce to type

谁能解释一下我做错了什么,下面我贴出我的代码

我的面食Class

public class Pasta {
String Name;
String Desc;
String Price;
String Temp;

public Pasta() {
}

public Pasta(String name, String desc, String price, String temp) {
    Name = name;
    Desc = desc;
    Price = price;
    Temp = temp;
}

public String getName() {
    return Name;
}

public void setName(String name) {
    Name = name;
}

public String getDesc() {
    return Desc;
}

public void setDesc(String desc) {
    Desc = desc;
}

public String getPrice() {
    return Price;
}

public void setPrice(String price) {
    Price = price;
}

public String getTemp() {
    return Temp;
}

public void setTemp(String temp) {
    Temp = temp;
}

我的Java代码

Ref.child("Products").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //Pasta List
            for (DataSnapshot pasta : dataSnapshot.child("Pasta").getChildren()) {
                Pasta p = pasta.getValue(Pasta.class);
                ProductsFragment.pastaArrayList.add(p);//My Pasta ArrayList
                Log.e("Pasta Object: ",p.getName());
            }

异常

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pizzanpasta, PID: 5177
com.firebase.client.FirebaseException: Failed to bounce to type
    at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
    at com.pizzanpasta.Handlers.FirebaseHandler.onDataChange(FirebaseHandler.java:74)
    at com.firebase.client.Query.onDataChange(Query.java:158)
    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.run(EventRaiser.java:38)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:103)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5300)
    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:830)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "Name" (class com.pizzanpasta.Models.Pasta), not marked as ignorable (4 known properties: , "desc", "price", "name", "temp"])
    at [Source: java.io.StringReader@42e16a68; line: 1, column: 10] (through reference chain: com.pizzanpasta.Models.Pasta["Name"])
    at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:555)
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:708)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1160)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:315)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
    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 com.pizzanpasta.Handlers.FirebaseHandler.onDataChange(FirebaseHandler.java:74) 
    at com.firebase.client.Query.onDataChange(Query.java:158) 
    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.run(EventRaiser.java:38) 
    at android.os.Handler.handleCallback(Handler.java:808) 
    at android.os.Handler.dispatchMessage(Handler.java:103) 
    at android.os.Looper.loop(Looper.java:193) 
    at android.app.ActivityThread.main(ActivityThread.java:5300) 
    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:830) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:646) 
    at dalvik.system.NativeStart.main(Native Method) 

如果我不将 snapsnot 投射到 class

for (DataSnapshot pasta : dataSnapshot.child("Pasta").getChildren()) {
                Log.e("Pasta Node; ", pasta.toString());
            }

即日志结果:

05-14 15:18:13.865 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Bolognese (Beef), value = {Name=Bolognese (Beef), Temp=temp, Desc=Bolognese Pasta with Red sause, Price=400} }
05-14 15:18:13.866 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Chicken La'Primavera, value = {Name=Chicken La'Primavera, Temp=temp, Desc=Backed Chicken La'Primavera Pasta, Price=400} }
05-14 15:18:13.866 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Lasagne, value = {Name=Lasagne, Temp=temp, Desc=Backed Lasagne Pasta, Price=300} }
05-14 15:18:13.866 10913-10913/com.pizzanpasta E/Pasta Node;: DataSnapshot { key = Marinara, value = {Name=Marinara, Temp=temp, Desc=Marinara Pasta with Red sause, Price=400} }

在日志结果中,您可以看到它类似于 Pasta Class,但我无法将其转换为 Pasta Class Object

由于您的 setter 方法被命名为 setName(…) Jackson 假定变量被命名为 name 因为 Java 命名约定。

这是您问题的原因。

解决该问题的最佳方法应该是在您的 Firebase 数据库中使用 "desc"、"price"、"name"、"temp"。

否则你可以使用 @JsonProperty 注释,像这样:

@JsonProperty("Name")
public void setName(String n) {
   // ...
}

@Gabriele 的回答有效。两种选择:

将您的 JSON 更改为使用小写 属性 名称

在您当前的设置中,Firebase 无法将 JSON 属性映射到 Java 对象,因为它期望的大小写不匹配。当你有一个方法 getName() 时,JSON 中的预期 属性 是 name。您的 JSON 使用 Name

要使用您当前的代码,您可以将 JSON 修改为:

{
  name: "Bolognese (Beef)",
  temp: "temp", 
  desc: "Bolognese Pasta with Red sause",
  price: 400
}

使用这些 属性 名称,Firebase 将能够在您的 Java class.

中找到正确的 fields/setters

使用 public 个字段

您也可以将字段声明为 public 而不用 getters/setters:

public class Pasta {
    public String Name;
    public String Desc;
    public String Price;
    public String Temp;

    public Pasta() {
    }

    public Pasta(String name, String desc, String price, String temp) {
        Name = name;
        Desc = desc;
        Price = price;
        Temp = temp;
    }
}

现在 Firebase 将找到 public 个与 JSON 属性同名的字段,因此它能够正确映射它们。