当case类包含一个scala枚举时,如何使用带有MongoCaseClassField的Rogue更新mongologging

我将现有代码从Rogue 1.1.8升级到2.0.0并将2.4-M5 to 2.5 lift-mongodb-record 2.4-M5 to 2.5

我很难编写包含scala枚举的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) /// ... } 

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

无法findcom.foursquare.rogue.BSONType [MyCaseClass]。和(_. myCaseClass setTo myCaseClass)types的证据参数的隐式值。

我们曾经在Rogue 1.1.8中使用这个工具,通过使用我们自己的MongoCaseClassField版本,这使得#formats方法可以被MongoCaseClassField 。 但是这个function包含在2.5-RC6中的lift-mongodb-record中,所以我们认为这个function现在应该可以使用了吗?

回答来自: 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时)而不是在编译时。

我介绍了BSONTypetypes的类来试图解决这个问题。 好处是它在编译时捕获BSON错误。 缺点是你需要在案例分类时做出select。

如果你想这样做的“正确”的方式,定义你的案例类加上一个BSONType“证人”的案件类。 要定义一个BSONType见证,您需要提供从该types到BSONtypes的序列化。 例:

  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", vv) ret } } 

也就是说,如果你为每个案例分类,这可能会相当麻烦。 如果你有一个通用的序列化scheme,你的第二个select是定义一个适用于任何case类的通用certificate:

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

希望这可以帮助,