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对象?或者我在这里错过了什么?
对于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)
| 归档时间: |
|
| 查看次数: |
3929 次 |
| 最近记录: |