Je suis mise à niveau du code existant de Rogue 1.1.8
à 2.0.0
et à lift-mongodb-record
partir 2.4-M5 to 2.5
.
J'ai des difficultés à écrire MongoCaseClassField
qui contient une énumération scala, avec laquelle je pourrais vraiment utiliser un peu d'aide.
Par exemple,
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)
/// ...
}
Lorsque nous essayons d'écrire dans ce champ, nous obtenons l'erreur suivante:
impossible de trouver la valeur implicite du paramètre de preuve de type com.foursquare.rogue.BSONType [MyCaseClass] .and (_. myCaseClass setTo myCaseClass)
Nous avions l'habitude de faire fonctionner cela dans Rogue 1.1.8, en utilisant notre propre version de MongoCaseClassField
, ce qui rendait la méthode #formats remplaçable. Mais cette fonctionnalité a été incluse dans lift-mongodb-record dans 2.5-RC6, nous avons donc pensé que cela devrait fonctionner maintenant?
Réponses:
Réponse provenant de: http://grokbase.com/t/gg/rogue-users/1367nscf80/how-to-update-a-record-with-mongocaseclassfield-when-case-class-contains-a-scala-enumeration# 20130612woc3x7utvaoacu7tv7lzn4sr2q
Mais plus pratique directement ici sur StackOverFlow:
Désolé, j'aurais dû intervenir ici plus tôt.
L'un des problèmes de longue date avec Rogue était qu'il était trop facile de créer accidentellement un champ qui n'était pas sérialisable en tant que BSON, et de le faire échouer à l'exécution (lorsque vous essayez d'ajouter cette valeur à un DBObject) plutôt qu'au moment de la compilation. .
J'ai introduit la classe de type BSONType pour essayer de résoudre ce problème. L'avantage est qu'il détecte les erreurs BSON au moment de la compilation. L'inconvénient est que vous devez faire un choix en ce qui concerne les classes de cas.
Si vous voulez faire cela de la manière «correcte», définissez votre classe de cas plus un «témoin» BSONType pour cette classe de cas. Pour définir un témoin BSONType, vous devez fournir une sérialisation de ce type à un type BSON. Exemple:
Cela dit, cela peut être assez fastidieux si vous le faites pour chaque classe de cas. Votre deuxième option consiste à définir un témoin générique qui fonctionne pour n'importe quelle classe de cas, si vous avez un schéma de sérialisation générique:
J'espère que cela t'aides,
la source