我目前与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)
PhoneNumber 是 com.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)
[...]
关于如何解决这个问题的任何想法? 感谢
答案 0 :(得分:1)
Salat开发者在这里。我不熟悉libphonenumber,但这很可能是因为看起来你正在尝试序列化内部类。
要尝试的东西。如果您将PhoneNumber
类复制粘贴到本地包的顶层(不在对象,特征或类中),扩展带来i18n优点的相关类/接口,并将类型参数更改为点相反,在这个班级,它有效吗?
如果是这样,问题是Salat不支持内部类。如果没有,我们将不得不进一步了解。
答案 1 :(得分:0)
您无法直接将Java类序列化为Salat。您需要编写自定义salat序列化程序或将PhoneNumber
写为案例类