grails中的自定义域约束

时间:2014-01-09 11:38:34

标签: grails gorm grails-2.0 grails-domain-class

public class Service {

    String reviewChanges
    String comment

    static constraints = {
      reviewChanges (inList:['NO','YES'])
      comment validator: { val, obj ->
        if(reviewChanges=='YES') {
          (nullable:false, blank:false, minSize:1, maxSize:500)
        } else {
          (nullable:true, blank:true, minSize:1, maxSize:500)
        }
      }
    }
}

以上评论验证器对我不起作用。 我想如果reviewChanges字段选择YES则评论字段必须是必填字段否则评论提交非强制性

3 个答案:

答案 0 :(得分:1)

使用自定义验证器的最佳方式就是这样..

static constraints = {
    reviewChanges(inList:['NO','YES'])
    comment validator: { val, obj,errors ->
        if (obj.reviewChanges == 'YES' && StringUtils.isEmpty(val))  { 
            errors.rejectValue('comment',"some.custom.validation.key")
        }
    }
}

errors.rejectValue 将允许您使用propertyName提供正确的字段错误,并且您也可以将其用于参数化错误...

errors.rejectValue('propertyName','errorCode',errorArgs as Object[],'defaultMessage')

并定义errorCode是message.properties以访问errorArgs,如

errorCode = This is {0} first parameter being passed as errorArgs.

由于

答案 1 :(得分:0)

你可以做这样的事情我想(我没有测试过这个,但是你明白了):

static constraints = {
    reviewChanges(inList:['NO','YES'])
    comment validator: { val, obj ->
        if (obj.reviewChanges == 'YES' && StringUtils.isEmpty(val))  { 
            return "some.custom.validation.key"
        }
    }
}

答案 2 :(得分:0)

除非要求将reviewChanges作为字符串,否则我会将其设为Boolean字段并使用Groovy事实,您应该可以执行以下操作:

class Service {

    Boolean reviewChanges
    String comment

    static constraints = {
       comment nullable:true, minSize:1, maxSize:500, validator: { val, obj ->
          if (obj.reviewChanges && (!val)){
             return "comments.required"
          }
       }
    }

}

使用Grails 2.3.3