我们将以下通用模式用于 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) {
}
我们要求禁止随机查询参数,例如。端点/对象?颜色=蓝色。为此,我们需要访问命令对象中的参数映射,以验证它不包含任何“意外”参数键。据我了解,默认方式只会在名为 color 的 CO 上创建一个成员,我看不出如何防止任意成员使用自定义验证器。我很乐意接受这样做的建议,从而允许我们使用这种默认方式。