我们在Grails 2.0.1中使用带有Grails控制器的命令对象。这是一个很棒的功能,它带来了非常漂亮,简洁的控制器和完全验证的参数。我有一种情况,在控制器中实现了一个Web服务调用,其中有一些固定参数,然后是一些可变长度参数。我在各地搜索过,似乎无法找到一个例子。一般来说,grails文档对命令对象相当简洁。我可以在没有Command对象的情况下做我想做的事情,但是我会在这组控制器中打破模式,其中每个其他调用都使用一个Command对象。 FWIW这个特定的调用是一个POST,它将数据提交给后端。这里没有Domain对象,数据正在转换为电子表格中的一行。我们当然可以创建一个Domain对象来建模数据,但我不确定这是否有助于以任何方式解决问题。
我不确定代码示例是否会有所帮助,但无论如何都是这样:
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)没有错,但我真的很想坚持使用命令对象模式。
答案 0 :(得分: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
}
}
}
}