Validation 如何强制Grails命令对象已经过验证?
我们对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
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
}
这很有效。但也许你可以想出更优雅的方法。我在问题中添加了更多信息,解释了为什么我们不能使用这种默认方法。如果你对如何实现我们的目标有什么建议,请。这很有趣,我没有想到过滤器。我看看能想出什么办法。