J'essaye de faire une insertion sûre en utilisant GORM pour l'API de bas niveau de Mongo.Comment faire des insertions sécurisées en utilisant GORM pour l'API de bas niveau de Mongo?
J'ai reproduit le problème dans un projet Grails propre comme suit:
- Créer une nouvelle Grails projettent
- Désinstaller le plugin Hibernate
- Installer le Gorm pour le plugin Mongo
Créer une contrôleur avec l'action suivante
import com.mongodb.* class TestController { def mongo def index = { def database = mongo.getDB("ExampleDatabase") def collection = database.getCollection("ExampleCollection") def document = new BasicDBObject(); document.put("key", "value") collection.insert(document, WriteConcern.SAFE) render "" } }
Lors du tir de l'action, l'exception suivante est générée:
2011-07-27 12:53:03,161 [http-8080-1] ERROR errors.GrailsExceptionResolver - Exception occurred when processing request: [GET] /WriteConcern.SAFE-test/test/index Stacktrace follows: groovy.lang.MissingPropertyException: No such property: value for class: com.mongodb.WriteConcern at com.gmongo.internal.Patcher$__converAllCharSeqToString_closure2.doCall(Patcher.groovy:81) at com.gmongo.internal.Patcher._converAllCharSeqToString(Patcher.groovy:80) at com.gmongo.internal.Patcher$_converAllCharSeqToString.callStatic(Unknown Source) at com.gmongo.internal.Patcher$_converAllCharSeqToString.callStatic(Unknown Source) at com.gmongo.internal.Patcher._convert(Patcher.groovy:69) at com.gmongo.internal.Patcher$_convert.callStatic(Unknown Source) at com.gmongo.internal.Patcher$__patchInternal_closure1.doCall(Patcher.groovy:31) at writeconcern.safe.test.TestController$_closure1.doCall(TestController.groovy:17) at writeconcern.safe.test.TestController$_closure1.doCall(TestController.groovy) at java.lang.Thread.run(Thread.java:680)
Si je change l'action d'utiliser l'API Mongo Java comme suit:
def index = { def database = new Mongo().getDB("ExampleDatabase") def collection = database.getCollection("ExampleCollection") def document = new BasicDBObject(); document.put("key", "value") collection.insert(document, WriteConcern.SAFE) render "" }
Maintenant, il fonctionne et le document est persisté dans la base de données Mongo comme prévu.
Ma question est la suivante: Est-ce un bug avec l'emballage GMongo, ou alors comment doit se faire en toute sécurité écritures en utilisant l'API de bas niveau?
Merci pour l'explication. Monkeypatching la classe WriteConcern comme vous l'avez dit fonctionne très bien. – AndrewW