当 case 类包含 scala 枚举时,如何使用 Rogue 和 MongoCaseClassField 更新 mongo 记录

我正在升级现有的代码从 Rogue 1.1.82.0.0lift-mongodb-record2.4-M5 to 2.5

我在编写包含 scala enum 的 MongoCaseClassField时遇到了困难,我确实需要一些帮助。

比如说,

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)
/// ...
}

当我们尝试写入这个字段时,会得到以下错误:

类型的证据参数找不到隐式值 BSONType [ MyCaseClass ] . 和(_. myCaseClass 设置为 myCaseClass)

我们曾经在 Rogue 1.1.8中使用我们自己版本的 MongoCaseClassField,这使得 # format 方法可以被覆盖。但是这个功能已经包含在2.5-RC6的 Lift-mongodb-record 中了,所以我们认为这个功能现在应该可以工作了吗?

2069 次浏览

答案来自: http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when-case-class-contains-a-scala-enumeration#20130612woc3x7utvaoacu7tv7lzn4sr2q

但是在 StackOverFlow 上更方便:


抱歉,我应该早点插嘴的。

罗格的一个长期存在的问题是太容易 意外地创建了一个不能序列化为 BSON 的字段,并拥有它 在运行时失败(当您尝试将该值添加到 DBObject 时) ,而不是 在编译时。

为了解决这个问题,我引入了 BSONType 类型类 它在编译时捕获 BSON 错误 选择案例课程。

如果您希望以“正确”的方式完成此操作,请定义您的 case 类加上 为该案例类输入“见证”。要定义一个 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
}
}

也就是说,如果你每个案例都这样做的话,这会是一个相当沉重的负担 第二个选项是定义一个适用于任何 Case 类,如果您有一个通用的序列化方案:

 implicit def CaseClassesAreBSONTypes[CC <: CaseClass]: BSONType[CC] =
new BSONType[CC] {
override def asBSONObject(v: CC): AnyRef = {
// your generic serialization code here, maybe involving formats
}
}

希望这对你有帮助,