【问题标题】:grails action required parameter checkgrails 操作所需的参数检查
【发布时间】:2013-05-05 02:43:40
【问题描述】:

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

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

编辑

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

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

【问题讨论】:

  • 如果@tedias 的解决方案太“乏味”,没有双关语,你可以直接使用 JAX-RS 对,即如果你需要很大的灵活性。你也可以试试 grails-jaxrs -> github.com/krasserm/grails-jaxrs/wiki

标签: grails


【解决方案1】:

如果您使用 params 中的数据来填充域类的实例,您只需相应地设置约束,填充域类的实例,然后使用 validate 方法。

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

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

@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 会自动 创建命令对象类的实例并填充其 通过绑定请求参数的属性。如果命令对象 类被标记为 Validateable 然后命令对象将是 验证。

【讨论】:

  • 谢谢埃利亚斯。请检查问题中提供给我的进一步修改。
  • 不客气!我明白了,您是说创建通用命令对象所需的参数组合太多不同,对吗?如果确实如此,那么尝试滚动您自己的验证机制可能是一个好主意。也许像validateParams(params, [list, of, constraints]) 这样的方法——你必须想出一个很好的约束表示。
【解决方案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. 控制器仅用于 HTTP 路由到操作,而不用于验证。因此,关注点分离。
  2. 由于命令对象的成员在执行action 期间动态绑定到params,因此它们充当业务对象/bean,您也可以在其中处理域(应用程序业务域)相关逻辑。

更新

这是一个sample code,如何使用命令对象对controller 中的所有actions 进行验证。

【讨论】:

  • 有两件事我想我忘了提到 - 1. 这些控制器动作用于实现 web 服务,它们没有链接到 GSP。 2.所需的参数需要因动作而异。牢记这一点,使用命令对象似乎不是正确的方法。每个方法都会有不同的所需参数,我们不能为每个 Web 服务创建命令对象。 Spring 有类似的东西,我们可以为每个动作指定参数,它们是必需的还是可选的。
  • UrlMapping.groovy 还具有定义每个操作的约束的能力。你也可以看看。如果我没记错的话,Command 对象也应该适用于 Web 服务(例如:REST),因为与命令对象的绑定发生在调用操作之后。
  • 我想要传达的内容非常简单,并且有助于使控制器看起来更简单:)。首先,您也可以将命令对象用于 RESTful Web 服务。其次,Contoller 中的验证使controller 非常混乱。第三,你可以有一个单一的 Command 对象来处理你所有的controlleractions。第四,您可以完全访问从controller 抽象而来的命令对象中的validator。看看this 示例代码。
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 2011-12-16
  • 2021-09-10
  • 1970-01-01
  • 2021-08-14
  • 2020-02-27
  • 2020-02-12
相关资源
最近更新 更多