Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 如何强制Grails命令对象已经过验证?_Validation_Grails_Command Objects - Fatal编程技术网

Validation 如何强制Grails命令对象已经过验证?

Validation 如何强制Grails命令对象已经过验证?,validation,grails,command-objects,Validation,Grails,Command Objects,我们对Grails控制器和命令对象使用以下常规模式 SomeController { def someAction() { SomeCommandObject co = SomeCommandObject.valueOf(params) if(!co.validate()) { // return bad request } someService.doWork(co) // re

我们对Grails控制器和命令对象使用以下常规模式

SomeController {
    def someAction() {
        SomeCommandObject co = SomeCommandObject.valueOf(params)

        if(!co.validate()) {
            // return bad request
        }

        someService.doWork(co)
        // return ok
}

SomeService {
    def doWork(SomeCommandObject co) {
        notTrue(!co.hasErrors(), 'cant have errors') // Commons validation

        // do actual work
    }
}
显然,如果未调用co.validate(),则.hasErrors()将始终返回false。是否有更好的方法来强制在应用程序层之间传递命令对象之前调用.validate()?我们不想传递无效的命令对象,但也不想强制每个新方法重新验证命令对象

注意:我们没有使用默认的控制器/命令对象创建模式,因为我们需要进行一些自定义参数映射检查,我们使用静态valueOf方法来创建命令对象。改变这种做法的答案也是受欢迎的

编辑:关于为什么不使用“默认”控制器/命令对象创建的更多信息。特别是为什么我们不这样做

def someAction(SomeCommandObject co) {
}

我们需要禁止随机查询参数,例如端点/对象?颜色=蓝色。为此,我们需要访问command对象中的参数映射,以验证它不包含任何“意外”参数键。据我所知,默认方法只是在共同命名的颜色上创建一个成员,我不知道如何防止使用自定义验证器的任意成员。我很乐意接受这样做的建议,从而允许我们使用此默认方式。

您应该这样做:

def someAction(SomeCommandObject co) {
    if (!co.hasErrors()) {
       someService.doWork(co)
    }
}

通过将SomeCommandObject作为参数传入,grails将自动从params和validate中填充它。无需手动操作。

是;您可以做的是将命令对象作为参数传递给控制器,然后命令将始终自动验证

此外,您可以做的是生成一个过滤器或类似的过滤器,这样您就不必每次都检查hasErrors(),而是以相同的方式处理所有情况(例如,抛出一个错误,或返回一个特定的响应)

在我们创建的应用程序中,我们有如下内容:

withValidCommand(cmd) {
     // do work
}

这很有效。但也许你可以想出更优雅的方法。

我在问题中添加了更多信息,解释了为什么我们不能使用这种默认方法。如果你对如何实现我们的目标有什么建议,请。这很有趣,我没有想到过滤器。我看看能想出什么办法。