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 属性同名的字段,因此它能够正确映射它们。
谁能解释一下我做错了什么,下面我贴出我的代码
我的面食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 属性同名的字段,因此它能够正确映射它们。