Grails 如何注册自定义约束

Grails 如何注册自定义约束,grails,gorm,grails-3.0,grails3,Grails,Gorm,Grails 3.0,Grails3,我已经创建了一个自定义约束(大多数代码都是从中复制的),我想在我的项目中使用它 如何注册此新约束,以便在域类和命令对象中使用它?我试着遵循这一点,但没有成功。我还尝试从中复制代码,但也没有成功。在Config.groovy中添加以下内容: grails.gorm.default.constraints = { validMobilePhone(validator: { value, obj, errors -> if (!value) return

我已经创建了一个自定义约束(大多数代码都是从中复制的),我想在我的项目中使用它


如何注册此新约束,以便在域类和命令对象中使用它?我试着遵循这一点,但没有成功。我还尝试从中复制代码,但也没有成功。

在Config.groovy中添加以下内容:

grails.gorm.default.constraints = {
    validMobilePhone(validator: { value, obj, errors ->
        if (!value) return

        value = PhoneNumberUtils.sanitizeNumber(value)

        if (!PhoneNumberUtils.validateMobilePhone(value)) {
            errors.rejectValue('mobilePhone', "invalid")
        }
    })

    nonNegative(min: new BigDecimal(0))

}
然后在您的域中使用此约束:

static constraints = {
    value shared: 'nonNegative'
}

在Config.groovy中添加以下内容:

grails.gorm.default.constraints = {
    validMobilePhone(validator: { value, obj, errors ->
        if (!value) return

        value = PhoneNumberUtils.sanitizeNumber(value)

        if (!PhoneNumberUtils.validateMobilePhone(value)) {
            errors.rejectValue('mobilePhone', "invalid")
        }
    })

    nonNegative(min: new BigDecimal(0))

}
然后在您的域中使用此约束:

static constraints = {
    value shared: 'nonNegative'
}

我在一个Grails3项目中设置了几个自定义约束类,并将它们转发到Grails4

在我的应用程序类中,我将自定义约束注册到2个约束注册中心。在应用程序类上有几个方法可以选择来实现这一点。我不知道我的选择是否是最好的

void doWithDynamicMethods(){
    //for domains
    applicationContext.getBean(
        org.grails.datastore.mapping.validation.ValidatorRegistry
    ).addConstraintFactory( someConstraintFactory )
    
    //for command objects
    (
        (DefaultConstraintEvaluator)
        applicationContext.getBean(
            org.grails.datastore.gorm.validation.constraints.eval.ConstraintsEvaluator
        )
    ).constraintRegistry.addConstraintFactory( someConstraintFactory )
}

我在一个Grails3项目中设置了几个自定义约束类,并将它们转发到Grails4

在我的应用程序类中,我将自定义约束注册到2个约束注册中心。在应用程序类上有几个方法可以选择来实现这一点。我不知道我的选择是否是最好的

void doWithDynamicMethods(){
    //for domains
    applicationContext.getBean(
        org.grails.datastore.mapping.validation.ValidatorRegistry
    ).addConstraintFactory( someConstraintFactory )
    
    //for command objects
    (
        (DefaultConstraintEvaluator)
        applicationContext.getBean(
            org.grails.datastore.gorm.validation.constraints.eval.ConstraintsEvaluator
        )
    ).constraintRegistry.addConstraintFactory( someConstraintFactory )
}

Grails验证(和其他东西)在Grails 3.3之后被重构到GORM,这是一个破坏性的变化,留下了一些重要方面的文档。Grails验证(和其他东西)在Grails 3.3之后被重构到GORM,这是一个破坏性的更改,留下了一些重要方面的文档,Grails4.0.5文档称要将其包含在GrailsApp/conf/runtime.groovy中。如果闭包包含3个参数,则它必须直接作用于errors对象。这意味着属性名是硬连线的——不适合共享验证器。让闭包接受1或2个参数,并根据validator doco返回一个列表或字符串。所有这些都是一个有用的解决方法,但并没有回答最初的问题。如果闭包包含3个参数,则它必须直接作用于errors对象。这意味着属性名是硬连线的——不适合共享验证器。让闭包接受1或2个参数,并根据validator doco返回一个列表或字符串。所有这些都是一个有用的解决方法,但并没有回答最初的问题。