grails action需要参数检查

时间:2013-05-05 02:43:40

标签: grails

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

我可以获取参数并对每个动作进行明确检查,但这只是为了简单验证而已。是否有一种简单的方法,以便返回缺少参数名称的默认错误消息。

修改

我认为有两件事我忘了提及 - 1.这些控制器操作用于实现Web服务,并且它们不与GSP链接。 2.所需的参数需要因行动而异。使用命令对象记住这一点似乎不正确的方法。每个方法都会有不同的必需参数,我们无法为每个Web服务创建命令对象。

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

2 个答案:

答案 0 :(得分:2)

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

如果您要验证的数据与Domain类并不真正相关,您仍然可以通过创建Command Object并在控制器操作中指定它来使用相同的验证机制。

这是docs的命令对象示例:

@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
    }
}

the docs的相关引用:

  

在执行控制器操作之前,Grails会自动执行   创建命令对象类的实例并填充它   通过绑定请求参数的属性。如果是命令对象   class用Validateable标记,然后命令对象就是   验证

答案 1 :(得分:2)

Command在这些场景中,对象很方便。您可以使用params绑定定义命令对象,并在每个/所有绑定上添加约束。您还可以使用自定义validator来验证请求参数(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}
}

您可以找到更多详情here

在命令对象中放置请求参数验证的优点是:

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

    <强>更新

    以下sample code {{3}}命令对象如何用于actions中所有controller的验证。