2016-07-22 6 views
2

firebase用の新しいサーバSDK firebase-server-sdk(3.0.1)は、スカラケースクラスの逆シリアル化をサポートしていますか?以前のfirebase java sdkは、ケースクラスをサポートするためにscala moduleにボルトで接続できるjacksonを使用していました。新しいSDKと似たようなことが可能かどうかは不明です。 Gsonやカスタムクラスマッパーを使用していますか?新しいfirebase-server-sdkを持つスカラケースクラス

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) 

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])に失敗します:Firebaseリスナーの設定などにより

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

:最も簡単な例では

私はのようなクラスにアノテーションを追加しようとしましたその後、210が、取得:

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

ではなくなってScalaのケースクラス上の任意のアイデアが新しいfirebase SDKとうまく再生するには、注釈を付けたり、すべてのケースクラスにコードを追加するのウサギの穴を下に行きますか?

答えて

0

AFAIKでは、直接ケースクラスを使用する方法はありません。私は、@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) 
    } 
}) 
関連する問題