FirebaseException:无法退回到键入

时间:2016-05-14 10:27:21

标签: android firebase firebase-realtime-database

有人可以解释一下我做错了吗,下面我发布了我的代码

enter image description here

My Pasta 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$1.onDataChange(FirebaseHandler.java:74)
    at com.firebase.client.Query$1.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$1.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$1.onDataChange(FirebaseHandler.java:74) 
    at com.firebase.client.Query$1.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$1.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投入课堂

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

2 个答案:

答案 0 :(得分:3)

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

这是你问题的原因。

解决此问题的最佳方法应该是在Firebase数据库中使用“desc”,“price”,“name”,“temp”。

否则您可以使用@JsonProperty注释,如下所示:

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

答案 1 :(得分:1)

@ 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类中找到正确的字段/ setter。

使用公共字段

您还可以将字段声明为公共字段,并且不使用getter / setter:

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将找到与JSON属性同名的公共字段,因此它可以正确映射它们。