3

我们在 Grails 2.0.1 中使用带有 Grails 控制器的命令对象。这是一个了不起的功能,并产生了非常漂亮、简洁的控制器,并具有完全验证的参数。我有一个案例,在控制器中实现了一个 Web 服务调用,其中有一些固定参数,然后是一些可变长度参数。我用谷歌搜索了整个地方,似乎找不到一个例子。一般而言,grails 文档对命令对象相当简洁。我可以在没有 Command 对象的情况下做我想做的事,但是我会打破这组控制器中的模式,其中每个其他调用都使用 Command 对象。FWIW 这个特定的调用是一个将数据提交到后端的 POST。这里没有域对象,数据正在被转换为电子表格中的一行。

我不确定代码示例是否会有所帮助,但无论如何这里是一个:

package com.companyname.platform.api

    class ApiController {
        static allowedMethods = [save:'POST', close:'POST', storeResults: 'POST']

        def save = { APISaveCommand cmd->
            doSaveAction(cmd)
        }
        def close = APICloseCommand cmd->
            doCloseAction(cmd)
        }
        def storeResults = { params->
            doStoreResults(params)
        }
    }
}

看看 storeResults 如何没有 Command 对象?它需要可变数量的参数。在上面的代码中,假设 do*Action 方法位于已注入此控制器的 Service 中。doStoreResults(params) 没有错,但我真的很想坚持使用命令对象模式。

4

1 回答 1

1

根据您的评论,是的,在这种情况下可以使用命令。Juts 在命令中声明所有字段,并对必须成对声明的字段实施自定义验证器

在验证器中,您可以访问字段值以及对象实例,因此您可以轻松比较其中一个是否为空,另一个是否为空。

@Validateable
class MyCommand {
  String a
  String b
  String c

  static constraints = {
    a nullable: false, blank: false
    b validator: { val, obj ->
      if((!val && obj.c) || (val && !obj.c)) {
        return 'mycommand.declareBAndC.message' //key to the i18n message
      }
    }
  }

}
于 2012-12-11T16:31:50.753 回答