Grails 命令对象可以有可变数量的参数吗?

Posted

技术标签:

【中文标题】Grails 命令对象可以有可变数量的参数吗?【英文标题】:Can Grails Command Objects have variable number of parameters? 【发布时间】:2012-11-28 03:51:11 【问题描述】:

我们在 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) 没什么问题,但我真的很想坚持使用命令对象模式。

【问题讨论】:

没有办法拥有具有动态属性的命令对象 如果您不知道参数中的内容,为什么需要命令?你会执行一些自定义验证吗? 对不起,如果我暗示我不知道会发生什么。有许多固定参数是必需的并且应该被验证。但是有许多额外的参数可能包括也可能不包括在内。这些参数的性质是,即使是可变参数也将从验证中受益,因为它们必须成对出现。看起来这不是一个特别独特的用例。好消息是使用通用对象“params”很容易处理,如 storeResults 中所示。但很遗憾我不能使用非常强大的 Grails 命令对象。 【参考方案1】:

根据您的评论,是的,在这种情况下可以使用命令。 juts在命令中声明所有字段,对需要成对声明的字段实现custom validators。

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

@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
      
    
  


【讨论】:

嗯,也许我说错了。我知道所有即将到来的固定参数,我知道可变组件的性质,但我不知道会有多少。因此,使用您的示例,我必须声明字符串 a..z,然后我将被限制为 26 个变量对。我们已经考虑过这一点,因为出于所有实际目的,可能存在一个高端。但我真的很想知道是否可以使用可变数量的参数。我认为这是一个会派上用场的功能。我想出了几种可以做到这一点的方法。评论中没有给我足够的空间来解释! 嗯,你是说参数中可能有 n 次 a 吗?类似于 a[0] = xxx、a[1] = xxx、a[2] = xxx? 是的,类似的。想象一下,您有一些固定数据,即年龄、性别、位置等人口统计数据。现在假设用户可以请求信息。完成后,他们会获得更多信息。因此,他们请求的信息量可能是 1 项或 200 项。但是这些数据都是密切相关的,并且是来自平板电脑的简单 POST 的一部分。我可以通过使用带有无类型参数对象的 storeResults 轻松实现这一点(请参阅 OP),但我确实挖掘了命令对象的功能。我不认为我的用例是独一无二的。我认为其他人会对 Command Objs 有类似的用途

以上是关于Grails 命令对象可以有可变数量的参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

可以将可变数量的参数传递给函数吗?

Grails 命令对象数据绑定

C#方法可以定义可变数量的对象参数,以及整数参数上的变量数吗?

将可变数量的 bash 命令行参数传递给 MATLAB 函数

UDF:处理范围和可变数量的参数

C 编译器如何实现具有可变数量参数的函数?