【发布时间】: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 命令对象。
标签: grails controller grails-2.0 command-objects