gpt4 book ai didi

mongodb - 当案例类包含 Scala 枚举时,如何使用 Rogue 和 MongoCaseClassField 更新 mongo 记录

转载 作者:IT老高 更新时间:2023-10-28 11:12:10 25 4
gpt4 key购买 nike

我正在将现有代码从 Rogue 1.1.8 升级到 2.0.0lift-mongodb-record2.4- M5 到 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)
/// ...
}

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

could not find implicit value for evidence parameter of type com.foursquare.rogue.BSONType[MyCaseClass] .and(_.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

但直接在 StackOverFlow 上更方便:


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

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

我引入了 BSONType 类型类来尝试解决这个问题。好处是它在编译时捕获 BSON 错误。缺点是你需要做一个案例类的选择。

如果您想以“正确”的方式执行此操作,请定义您的案例类加上BSONType "witness"为那个案例类。要定义 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
}
}

也就是说,如果您针对每个案例都这样做,这可能会很麻烦类(class)。您的第二个选择是定义一个适用于任何案例类,如果你有一个通用的序列化方案:

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

希望这会有所帮助,

关于mongodb - 当案例类包含 Scala 枚举时,如何使用 Rogue 和 MongoCaseClassField 更新 mongo 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16992382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com