grails中的自定义域约束

grails中的自定义域约束,grails,gorm,grails-2.0,grails-domain-class,Grails,Gorm,Grails 2.0,Grails Domain Class,上面的注释验证器不适用于我。 我想如果reviewChanges字段选择YES,则注释字段必须为必填字段,否则注释字段为非必填字段我认为您可以这样做(我还没有测试过,但您明白了): 除非要求将reviewChanges作为字符串,否则我会将其设置为Boolean字段,并使用Groovy truth,您应该能够执行以下操作: static constraints = { reviewChanges(inList:['NO','YES']) comment validator: {

上面的注释验证器不适用于我。
我想如果reviewChanges字段选择YES,则注释字段必须为必填字段,否则注释字段为非必填字段

我认为您可以这样做(我还没有测试过,但您明白了):


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

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


使用Grails2.3.3

使用自定义验证器的最佳方式如下

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"
          }
       }
    }
错误。rejectValue将允许您使用propertyName给出正确的字段错误,也可以将其用于参数化错误

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")
        }
    }
}
并定义errorCode为message.properties以访问errorArgs,如

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

谢谢

我想这可能是obj.reviewChanges,而不仅仅是reviewChanges。很好,谢谢。我已经更新了答案。感谢您的回复,但解决方案不起作用。我得到以下错误98:应为“}”,找到“:”@第98行,第26列。注释验证程序:{val,obj->^1错误
errors.rejectValue('propertyName','errorCode',errorArgs as Object[],'defaultMessage')
errorCode = This is {0} first parameter being passed as errorArgs.