6

私は 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()
        }
    }
}

インスタンスを検証しようとすると、セクションの値に関係なくSurveyCommand常に返され、 ( )true内のカスタム バリデータは呼び出されません。grails のドキュメントから、この種のネストされた構造がサポートされているようです(デフォルトは true です)。しかし、このルールはドメイン オブジェクトにのみ適用され、コマンド オブジェクトには適用されないのではないでしょうか? それとも、ここで何かが足りないのですか?SectionCommandanswerNotBlankdeepValidate

4

3 に答える 3

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)
    }
}
于 2013-04-24T02:41:58.417 に答える