Grails 3.3.1带域对象参数的控制器操作-数据如何绑定?

Grails 3.3.1带域对象参数的控制器操作-数据如何绑定?,grails,data-binding,controller,Grails,Data Binding,Controller,看起来有点类似,但询问者试图理解当域对象是控制器操作参数时一对多数据绑定是如何工作的 我想了解,在幕后,当域类作为控制器操作的参数提供时,将调用哪些方法。考虑默认的更新< /强>动作:< /P> def update(MyDomain myDomain) { if (myDomain == null) { notFound() return } try { myDomainService.save(myDomain)

看起来有点类似,但询问者试图理解当域对象是控制器操作参数时一对多数据绑定是如何工作的

我想了解,在幕后,当域类作为控制器操作的参数提供时,将调用哪些方法。考虑默认的<强>更新< /强>动作:< /P>
def update(MyDomain myDomain) {
    if (myDomain == null) {
        notFound()
        return
    }

    try {
        myDomainService.save(myDomain)
    } catch (ValidationException e) {
        respond myDomain.errors, view:'edit'
        return
    }

    request.withFormat {
        form multipartForm {
            flash.message = message(code: 'default.updated.message', args:
                [message(code: 'myDomain.label', default: 'MyDomain'), myDomain.id])
            redirect myDomain
        }
        '*'{ respond myDomain, [status: OK] }
    }
}
导致上述控制器操作范围的事件顺序是什么?我最好的猜测如下,但我想确认一下

def someActionWrapper() {
    MyDomain instance = MyDomain.get(params.id)
    instance.properties = params
    update(instance)
}

我认为它一定是去DB获取表单上没有的任何字段,然后用表单上的任何值覆盖,然后调用实际的控制器操作

编辑 提出此问题时库的当前版本:

  • Grails 3.3.1
  • Groovy 2.4.12
    • 请参阅

      简言之

      // This is pseudocode but it addresses the broad strokes of what you are asking about...
      MyDomain md
      if(params.id) {
          md = MyDomain.get(params.id)
      } else if (request.method == 'POST') {
          md = new MyDomain()
      }
      
      if(md) {
          def doBinding = true
          if(params.id) {
              if(!(request.method in ['PUT', 'POST', 'DELETE'])) {
                  doBinding = false
              }
          }
      
          if(doBinding) {
              // params won't necessarily be used here
              // if the request has a body, it will be used
              bindData md, params
          }
      
          // subject md to dependency injection
      
          // if md is Validateable then call .validate() on it
      }
      
      callToTheOriginalAction(md)
      

      “我想它一定是去数据库获取表单上没有的任何字段,然后用表单上的任何值覆盖,然后调用实际的控制器操作。”-这是真的。它将进入数据库检索所有字段,而不仅仅是表单上没有的字段。下面我的回答提供了更多细节。谢谢!这就是我一直在寻找的信息。