0

我尝试验证命令对象上的嵌套域类实例。

具有以下命令对象

package demo

import grails.databinding.BindingFormat

class SaveEventCommand {

    @BindingFormat('yyyy-MM-dd')
    Date date

    Refreshment refreshment

    static constraints = {
        date validator: { date -> date > new Date() + 3}
        refreshment nullable: true
    }
}

并且具有以下具有自己的约束的域类

package demo

class Refreshment {

    String food
    String drink
    Integer quantity

    static constraints = {
        food inList: ['food1', 'food2', 'food3']
        drink nullable: true, inList: ['drink1', 'drink2', 'drink3']
        quantity: min: 1
    }
}

当刷新不可为空时,我需要命令对象验证日期属性并检查刷新实例中的相应限制

现在尝试在控制器中使用此代码:

def save(SaveEventCommand command) {
    if (command.hasErrors() || !command.refreshment.validate()) {
        respond ([errors: command.errors], view: 'create')

        return
    }

    // Store logic goes here
}

在这里,!command.refreshment.validate()我尝试验证刷新实例,但我得到的结果是没有错误,即使传递不正确的数据也是如此。

感谢您的任何指导,并感谢您的时间

4

2 回答 2

1

我通常只包含一些代码,这些代码将使用自定义验证器来启动对由另一个命令对象组成的任何属性的验证。例如:

thePropertyInQuestion(nullable: true, validator: {val, obj, err ->
    if (val == null) return
    if (!val.validate()) {
        val.errors.allErrors.each { e ->
            err.rejectValue(
                "thePropertyInQuestion.${e.arguments[0]}",
                "${e.objectName}.${e.arguments[0]}.${e.code}",
                e.arguments,
                "${e.objectName}.${e.arguments[0]}.${e.code}"
            )
        }
    }
})

这样,很明显我希望进行验证。另外,它将所有错误都移到了根错误集合中,这对我来说非常容易。

于 2017-10-24T17:50:26.773 回答
0

我能想到的两件事:

  1. grails.validation.Validateable在您的命令对象上实施
  2. 当您提供无效日期时会发生什么?验证时能看到错误吗?
于 2017-10-24T08:36:40.243 回答