首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用GORM对Mongo的低级API进行安全插入?

如何使用GORM对Mongo的低级API进行安全插入?
EN

Stack Overflow用户
提问于 2011-07-28 07:51:55
回答 1查看 1.2K关注 0票数 3

我试图使用GORM为Mongo的低级别API做一个安全的插入。

我在一个干净的Grails项目中复制了这个问题,如下所示:

  1. 创建一个新的Grails项目
  2. 卸载Hibernate插件
  3. 安装Mongo插件的GORM
  4. 使用以下操作创建控制器 * class TestController {com.mongodb索引={ def数据库= mongo.getDB("ExampleDatabase") def collection = database.getCollection("ExampleCollection") def文档=新BasicDBObject();document.put(“键”,“值”) collection.insert( document,WriteConcern.SAFE)呈现“}”}
  5. 触发该操作时,将引发以下异常: 2011-07-27 12:53:03,161 http-8080-1错误errors.GrailsExceptionResolver -在处理请求时发生异常: GET /WriteConcern.SAFE-test/test/index Stacktrace如下: groovy.lang.MissingPropertyException: No : value for class: com.mongodb.WriteConcern at com.gmongo.internal.Patcher._converAllCharSeqToString(Patcher.groovy:80) at com.gmongo.internal.Patcher$_converAllCharSeqToString.callStatic(Unknown( com.gmongo.internal.Patcher$_converAllCharSeqToString.callStatic(Unknown ) com.gmongo.internal.Patcher._convert(Patcher.groovy:69) at com.gmongo.internal.Patcher$_convert.callStatic(Unknown Source) 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.java.lang.Thread.run(Thread.java:680)
  6. 如果我将操作更改为使用,如下所示: def索引={ def数据库=新孟戈().getDB(“ExampleDatabase”) def集合= database.getCollection("ExampleCollection") def文档=新BasicDBObject();document.put(“键”,“值”) collection.insert( document,WriteConcern.SAFE)呈现"“}
  7. 现在它开始工作了,文档按预期的方式保存到Mongo数据库中。

我的问题是:这是GMongo包装器中的一个bug,还是应该如何使用低级API进行安全写入?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-28 19:03:30

这是由于GMongo库以及它如何修补DBCollection对象以处理将Map对象传递给insert方法并转换它们的方式。它假设insert方法的所有参数都是Map对象,然后尝试从Map.Entry获取value属性。

查看来自Patcher.groovy库的GMongo源,您将看到尝试执行此操作的函数_convert()。它看起来像一个带有参数类型检查(查看它是否是WriteConcern,或者在传递给_converAllCharSeqToString之前检查它是否实际上是一个Map )的Github项目的分支。

编辑:

为了进行适当的代码更改,我在Github上创建了一个拉请求,但是与Groovy一样,修补类也会有所帮助。您可以在您的WriteConcern中“修补”BootStrap.groovy类,使其具有一个getValue方法,这将允许您将参数传递到:

代码语言:javascript
复制
def init = { servletContext ->
    com.mongodb.WriteConcern.metaClass.getValue  = { null }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6855674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档