grails验证嵌套命令对象不起作用

Chr*_*ery 6 grails grails-validation command-objects grails-2.0

我正在使用grails 2.2.1并尝试验证嵌套的命令结构.这是我的命令对象的简化版本:

@Validateable
class SurveyCommand {

    SectionCommand useful
    SectionCommand recommend

    SurveyCommand() {
        useful = new SectionCommand(
                question: 'Did you find this useful?',
                isRequired: true)
        recommend = new SectionCommand(
                question: 'Would you recommend to someone else?',
                isRequired: false)
    }
}

@Validateable
class SectionCommand {
    String question
    String answer
    boolean isRequired

    static constraints = {
        answer(validator: answerNotBlank, nullable: true)
    }

    static answerNotBlank = { String val, SectionCommand obj ->
        if(obj.isRequired) {
            return val != null && !val.isEmpty()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试验证SurveyCommand它的实例时,true无论部分值如何都会返回,并且从不调用SectionCommand(answerNotBlank)中的自定义验证器.从grails文档中,似乎支持这种嵌套结构(deepValidate默认为true).但是,这个规则可能只适用于域对象而不适用于Command对象?或者我在这里错过了什么?

jgi*_*son 5

对于Grails 2.3及更高版本,我发现Cascade Validation Plugin可以很好地解决这个问题.它定义了一个名为cascade的新验证器类型,它完全符合您的期望.安装完成后,您的示例将变为:

class SurveyCommand {
    ...

    static constraints = {
        useful(cascade: true)
        recommend(cascade: true)
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 4

您可以将自定义验证器添加到主命令对象中

@Validateable
class SurveyCommand {

    SectionCommand useful
    SectionCommand recommend

    static subValidator = {val, obj ->
        return val.validate() ?: 'not.valid'
    }

    static constraints = {
        useful(validator: subValidator)
        recommend(validator: subValidator)
    }

    SurveyCommand() {
        useful = new SectionCommand(
            question: 'Did you find this useful?',
            isRequired: true)
        recommend = new SectionCommand(
            question: 'Would you recommend to someone else?',
            isRequired: false)
    }
}
Run Code Online (Sandbox Code Playgroud)