0

我目前在使用 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)

PhoneNumbercom.google.i18n.phonenumbers.Phonenumber$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)
}

这是我的自定义上下文:

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)
[...] 

关于如何解决这个问题的任何想法?谢谢

4

2 回答 2

1

萨拉特开发商在这里。我不熟悉 libphonenumber 但这很可能会崩溃,因为看起来您正在尝试序列化内部类。

有什么可以尝试的。如果将PhoneNumber类复制粘贴到本地包的顶层(不在对象、特征或类内),扩展带来 i18n 优点的相关类/接口,并将类型参数更改为指向此类,它有效吗?

如果是这样,问题是 Salat 不支持内部类。如果没有,我们将不得不进一步研究。

于 2014-09-12T19:56:37.413 回答
0

您不能将 Java 类直接序列化到 Salat。您需要编写自定义 salat 序列化程序或编写PhoneNumber为案例类

于 2014-09-12T19:46:18.383 回答