Jun*_*mez 128 scala class record lift mongodb
我从升级现有的代码Rogue 1.1.8,以2.0.0和lift-mongodb-record从2.4-M5 to 2.5.
我写的MongoCaseClassField包含scala enum 有困难,我真的可以使用一些帮助.
例如,
object MyEnum extends Enumeration {
type MyEnum = Value
val A = Value(0)
val B = Value(1)
}
case class MyCaseClass(name: String, value: MyEnum.MyEnum)
class MyMongo extends MongoRecord[MyMongo] with StringPk[MyMongo] {
def meta = MyMongo
class MongoCaseClassFieldWithMyEnum[OwnerType <: net.liftweb.record.Record[OwnerType], CaseType](rec : OwnerType)(implicit mf : Manifest[CaseType]) extends MongoCaseClassField[OwnerType, CaseType](rec)(mf) {
override def formats = super.formats + new EnumSerializer(MyEnum)
}
object myCaseClass extends MongoCaseClassFieldWithMyEnum[MyMongo, MyCaseClass](this)
/// ...
}
Run Code Online (Sandbox Code Playgroud)
当我们尝试写入此字段时,我们收到以下错误:
找不到com.foursquare.rogue.BSONType [MyCaseClass].和(_.myCaseClass setTo myCaseClass)类型的证据参数的隐含值
我们曾经在Rogue 1.1.8中使用我们自己的版本MongoCaseClassField,这使得#formats方法可以覆盖.但是这个功能被包含在2.5-RC6的lift-mongodb-record中,所以我们认为这应该现在可以正常工作?
答案来自:http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when-case-class-contains-a-scala-enumeration# 20130612woc3x7utvaoacu7tv7lzn4sr2q
对不起,我应该早点在这里打电话.
Rogue长期存在的一个问题是,很容易意外地创建一个不可序列化为BSON的字段,并且在运行时(当您尝试将该值添加到DBObject时)而不是在编译时失败.
我介绍了BSONType类型类来尝试解决这个问题.好处是它在编译时捕获了BSON错误.缺点是你需要在案例类别中做出选择.
如果您想以"正确"的方式执行此操作,请为该案例类定义案例类和BSONType"见证".要定义BSONType见证,您需要提供从该类型到BSON类型的序列化.例:
case class TestCC(v: Int)
implicit object TestCCIsBSONType extends BSONType[TestCC] {
override def asBSONObject(v: TestCC): AnyRef = {
// Create a BSON object
val ret = new BasicBSONObject
// Serialize all the fields of the case class
ret.put("v", v.v)
ret
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你为每个案例类做这件事,这可能会非常麻烦.如果您有一个通用的序列化方案,那么您的第二个选择是定义适用于任何案例类的通用见证:
implicit def CaseClassesAreBSONTypes[CC <: CaseClass]: BSONType[CC] =
new BSONType[CC] {
override def asBSONObject(v: CC): AnyRef = {
// your generic serialization code here, maybe involving formats
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助,
| 归档时间: |
|
| 查看次数: |
1994 次 |
| 最近记录: |