2014-09-12 76 views
0

我目前遇到Salat問題。希望你們能幫助我!Salat序列化錯誤

下面是快要把我逼瘋的情況下類:

object UserDAO extends SalatDAO[User, ObjectId](
    collection = DB("users") //Returns the "users" MongoCollection 
) 

case class User(
    _id: ObjectId = new ObjectId, 
    firstName: String, 
    lastName: String, 
    screenName: String, 
    phoneNumber: PhoneNumber, 
    validated: Boolean = false) 

******中國類型的實例com.google.i18n.phonenumbers.Phonenumber $ ******中國(我使用libphonenumber)

這是我的自定義變壓器:

class PhoneNumberTransformer extends CustomTransformer[PhoneNumber, String] { 
    val phoneNumberUtils = PhoneNumberUtil.getInstance() 
    def deserialize(b: String) = phoneNumberUtils.parse(b, "UK") 
    def serialize(a: PhoneNumber) = phoneNumberUtils.format(a, PhoneNumberFormat.INTERNATIONAL) 
} 

這是我的C ustom方面:

package object model { 

    implicit val ctx = new Context { 
    val name = "Custom Salat Context" 
    } 

    ctx.registerCustomTransformer(new PhoneNumberTransformer) 

} 

如果我嘗試使用的UserDAO插入一個新的用戶文檔,我得到這個異常:

project java.lang.IllegalArgumentException: can't serialize class com.google.i18n.phonenumbers.Phonenumber$PhoneNumber 
project  at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:284) 
project  at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:185) 
project  at org.bson.BasicBSONEncoder.putObject(BasicBSONEncoder.java:131) 
project  at com.mongodb.DefaultDBEncoder.writeObject(DefaultDBEncoder.java:33) 
[...] 

如何解決這個任何想法? 謝謝

+0

不知道這是否有幫助,但'PhoneNumber'是一個Java公共靜態類。 – 2014-09-12 18:52:01

回答

1

此處的Salat開發人員。我不熟悉libphonenumber,但是這很可能會因爲它看起來像試圖序列化一個內部類而崩潰。

有事要嘗試。如果複製將PhoneNumber類粘貼到本地程序包的頂層(不在對象,特徵或類中),則將相關的類/接口擴展爲帶來國際性的好處,並將類型參數改爲指向此類,它工作?

如果是這樣,問題是Salat不支持內部類。如果沒有,我們將不得不進一步觀察。

+0

不起作用。我使用了libphonenumber文檔,並且發現'PhoneNumber'類是一個內部類,它也是使用protobuf生成的。一個致命的混合物:D。謝謝你的幫助!我會暫時將這個數字保存爲一個字符串。 – 2014-09-14 15:54:27

0

您不能將Java類直接序列化到Salat。您需要編寫一個定製salat序列化程序或將PhoneNumber作爲案例類別