2

我如何在 Grails 控制器操作中检查是否已向此操作方法提供了所有必需的参数。换句话说,我可以简单地为我的操作所需的所有参数指定使用地图或列表对象吗?

我可以获取参数并在每个操作中进行显式检查,但这只是用于简单验证的大量代码。是否有一种简单的方法可以返回带有缺少参数名称的默认错误消息。

编辑

有两件事我想我忘了提到 - 1. 这些控制器动作用于实现 web 服务,它们没有链接到 GSP。2.所需的参数需要因动作而异。牢记这一点,使用命令对象似乎不是正确的方法。每个方法都会有不同的所需参数,我们不能为每个 Web 服务创建命令对象。

Spring 有类似的东西,我们可以为每个动作指定参数,它们是必需的还是可选的。

4

2 回答 2

2

如果您使用 params 中的数据来填充域类的实例,则可以相应地设置约束,填充域类的实例,并使用validate方法。

如果您要验证的数据与域类并不真正相关,您仍然可以使用大致相同的验证机制,方法是创建一个命令对象并在控制器操作中指定它。

这是文档中的命令对象示例:

@grails.validation.Validateable
class LoginCommand {
    String username
    String password
    static constraints = {
        username(blank: false, minSize: 6)
        password(blank: false, minSize: 6)
    }
}

然后在控制器中:

class LoginController {
    def login(LoginCommand cmd) {
        if (cmd.hasErrors()) {
            redirect(action: 'loginForm')
            return
        }
        // work with the command object data
    }
}

来自文档的相关引用:

在执行控制器动作之前,Grails 将自动创建命令对象类的实例并通过绑定请求参数来填充其属性。如果命令对象类被标记为 Validateable,那么命令对象将被验证。

于 2013-05-05T03:02:48.900 回答
2

Command在这些情况下,对象很方便。您可以使用绑定定义命令对象params并在每个/全部上添加约束。您还可以使用 customvalidator来验证请求参数 ( params)。

例如:

//Command Object
class LoginCommand{
   String userName
   String password

   static constraints = {
        //Constraints and validator defined here 
   }
}

在 Controller 中访问命令对象:

def myAction(LoginCommand lc){
   if(lc.hasErrors()){//redirect to error page or do something else}
}

您可以在此处找到更多详细信息。

将请求参数验证放在命令对象中具有以下优点:

  1. 控制器仅用于指向操作的 HTTP 路由,而不用于验证。因此,关注点分离。
  2. 由于命令对象的成员params在执行期间动态绑定action,因此它们充当业务对象/bean,您也可以在其中处理与域(应用程序业务域)相关的逻辑。

更新

这是一个示例代码,如何使用 Command Objectactionscontroller.

于 2013-05-05T03:10:12.790 回答