gpt4 book ai didi

grails - 如何使用 GORM 为 Mongo 的低级 API 进行安全插入?

转载 作者:可可西里 更新时间:2023-11-01 09:32:30 31 4
gpt4 key购买 nike

我正在尝试使用 GORM 为 Mongo 的低级 API 进行安全插入。

我已经在一个干净的 Grails 项目中重现了这个问题,如下所示:

  1. 创建一个新的 Grails 项目
  2. 卸载 Hibernate 插件
  3. 为 Mongo 插件安装 GORM
  4. 使用以下操作创建 Controller

    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 ""

    }
    }
  5. 触发操作时,抛出以下异常:

    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)
  6. 如果我将操作更改为使用 Mongo Java API,如下所示:

    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 ""

    }
  7. 现在可以正常工作了,文档按预期持久保存到 Mongo 数据库中。

我的问题是:这是 GMongo 包装器的错误,还是应该如何使用低级 API 完成安全写入?

最佳答案

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

查看 source of Patcher.groovy from GMongo library您会看到尝试执行此操作的函数 _convert()。它看起来像是 Github 项目的一个分支,对参数进行类型检查(要么查看它是否是 WriteConcern,要么在传递给 之前检查它是否实际上是一个 Map code>_converAllCharSeqToString) 是必要的。

编辑:

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

def init = { servletContext ->
com.mongodb.WriteConcern.metaClass.getValue = { null }
}

关于grails - 如何使用 GORM 为 Mongo 的低级 API 进行安全插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6855674/

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