130

我正在将现有代码Rogue 1.1.8从.2.0.0lift-mongodb-record2.4-M5 to 2.5

我在编写MongoCaseClassField包含 scala 枚举的内容时遇到了困难,我真的可以使用一些帮助。

例如,

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

当我们尝试写入该字段时,我们收到以下错误:

找不到 com.foursquare.rogue.BSONType[MyCaseClass] .and(_.myCaseClass setTo myCaseClass) 类型的证据参数的隐式值

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

4

1 回答 1

7

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

但是直接在 StackOverFlow 上更方便:


对不起,我应该早点来这里。

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
   }
 }

也就是说,如果您为每个案例类都这样做,这可能会很麻烦。如果您有通用序列化方案,您的第二个选项是定义适用于任何案例类的通用见证:

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

希望这可以帮助,

于 2015-06-30T09:19:43.237 回答