2016-07-22 24 views
2

Firebase firebase-server-sdk(3.0.1)的新服务器SDK是否支持Scala案例类别反序列化?之前的firebase java sdk使用了jackson,你可以在scala module中使用螺栓来支持case类。目前还不清楚它是否有可能对新SDK做类似的事情?它使用Gson还是一些自定义类映射器?具有新的firebase-server-sdk的Scala案例类别

在最简单的例子:

case class Person(firstName: String, lastName: String, age: Int) 

随着火力地堡监听设置,如:

var options = new FirebaseOptions.Builder() 
    .setDatabaseUrl("https://<your firebase>.firebaseio.com") 
    .setServiceAccount(new FileInputStream("firebase-auth.json")) 
    .build() 

FirebaseApp.initializeApp(options); 

var ref = FirebaseDatabase.getInstance().getReference("somepath") 
ref.addListenerForSingleValueEvent(new ValueEventListener { 
    override def onDataChange(dataSnapshot: DataSnapshot): Unit = { 
    println(dataSnapshot.getValue(classOf[Person])) 
    } 

    override def onCancelled(databaseError: DatabaseError): Unit = { 
    println(databaseError.getMessage) 
    } 
}) 

这将失败的的getValue调用dataSnapshot.getValue(classOf[Person])不同之处:

Exception in thread "FirebaseDatabaseEventTarget" com.google.firebase.database.DatabaseException: No properties to serialize found on class Person 
    at com.google.firebase.database.utilities.encoding.CustomClassMapper$BeanMapper.<init>(CustomClassMapper.java:495) 
    at com.google.firebase.database.utilities.encoding.CustomClassMapper.loadOrCreateBeanMapperForClass(CustomClassMapper.java:285) 
    at com.google.firebase.database.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:379) 
    at com.google.firebase.database.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:187) 
    at com.google.firebase.database.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:61) 
    at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:181) 
    at PetEventsNodeActorSpec$$anonfun$2$$anonfun$apply$mcV$sp$2$$anonfun$apply$mcV$sp$3$$anon$1.onDataChange(PetEventsNodeActorSpec.scala:290) 
    at com.google.firebase.database.Query$1.onDataChange(Query.java:147) 
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:57) 
    at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:45) 
    at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:35) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

我已经尝试给课程添加注释,例如@BeanProperty但随后得到:

Exception in thread "FirebaseDatabaseEventTarget" com.google.firebase.database.DatabaseException: Class Person is missing a constructor with no arguments 

而不是往下走注释或添加代码,每一个案例类,在获取的Scala case类与新的火力点SDK发挥很好的任何想法的兔子洞?

回答

0

AFAIK,没有办法直接使用case类。我最终创建了带有@BeanProperty注释的普通类,然后将它们转换为大小写类。原因

Exception in thread "FirebaseDatabaseEventTarget" com.google.firebase.database.DatabaseException: Class Person is missing a constructor with no arguments 

是因为你的类的构造函数必须是无参(即不能带任何参数):

import scala.beans.BeanProperty 

case class Person(firstName: String, lastName: String, age: Int) { 
    def toBean: PersonBean = { 
    val person = new PersonBean() 
    person.firstName = firstName 
    person.lastName = lastName 
    person.age = age 
    person 
    } 
} 

class PersonBean() { 
    @BeanProperty var firstName: String = "" 
    @BeanProperty var lastName: String = "" 
    @BeanProperty var age: Int = 0 
    def toCase: Person = Person(firstName, lastName, age) 
} 

var ref = FirebaseDatabase.getInstance().getReference("somepath") 
ref.addListenerForSingleValueEvent(new ValueEventListener { 
    override def onDataChange(dataSnapshot: DataSnapshot): Unit = { 
    val record = dataSnapshot.getValue(classOf[PersonBean]) 
    val person = if (record != null) record.toCase else null 
    } 

    override def onCancelled(databaseError: DatabaseError): Unit = { 
    println(databaseError.getMessage) 
    } 
})