既存のコードをRogue 1.1.8
から2.0.0
にアップグレードし、lift-mongodb-record
を2.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)
/// ...
}
このフィールドに書き込もうとすると、次のエラーが発生します。
タイプcom.foursquare.rogue.BSONType [MyCaseClass] .and(_。myCaseClass setTo myCaseClass)の証拠パラメーターの暗黙的な値が見つかりませんでした
Rogue 1.1.8では、独自のバージョンのMongoCaseClassField
を使用してこれを機能させていました。これにより、#formatsメソッドがオーバーライド可能になりました。しかし、その機能は2.5-RC6のlift-mongodb-recordに含まれていたので、これは今すぐ機能するはずだと思いましたか?
すみません、もっと早くここにチャイムを入れるべきでした。
Rogueの長年の問題の1つは、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
}
}
とはいえ、ケースクラスごとに実行する場合、これは非常に負担になる可能性があります。 2番目のオプションは、一般的なシリアル化スキームがある場合、任意のケースクラスで機能する一般的な監視を定義することです。
implicit def CaseClassesAreBSONTypes[CC <: CaseClass]: BSONType[CC] =
new BSONType[CC] {
override def asBSONObject(v: CC): AnyRef = {
// your generic serialization code here, maybe involving formats
}
}
お役に立てれば、