如何注册自定义约束

Posted

技术标签:

【中文标题】如何注册自定义约束【英文标题】:How to register a custom constraint 【发布时间】:2020-04-21 14:10:16 【问题描述】:

我创建了一个我想在我的项目中使用的自定义约束(大部分代码从 NullableConstraint 复制而来)。

如何注册这个新约束,以便在我的域类和命令对象中使用它?我试过关注这个answer,但这没有用。我也尝试从here 复制代码,但也没有用。

【问题讨论】:

Grails 验证(和其他东西)在 Grails 3.3 之后被重构为 GORM,这是一个破坏性的变化,导致几个重要方面的文档很少。 【参考方案1】:

我在 Grails 3 项目中设置了一些自定义约束类,并将它们带到 Grails 4。

在我的 Application 类中,我将自定义约束注册到 2 个约束注册表。 Application 类上有一些方法可供您选择来实现它。我不知道我的选择是不是最好的。

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 )

【讨论】:

【参考方案2】:

在您的 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'

【讨论】:

Grails 4.0.5 文档说将其包含在 grails-app/conf/runtime.groovy 中。如果闭包需要 3 个参数,它必须直接在错误对象上工作。这意味着属性名称是硬连线的——不适合共享验证器。让闭包接受 1 或 2 个参数并根据验证器 doco 返回一个列表或字符串。所有这些都是有用的解决方法,但不能回答最初的问题。

以上是关于如何注册自定义约束的主要内容,如果未能解决你的问题,请参考以下文章

在哪里注册属性路由自定义类约束

自定义 UIView 如何响应基于约束的框架变化

如何根据预先确定的约束值自定义热图颜色?

Symfony2:如何对自定义复合表单类型使用约束?

如何在 symfony 5 中验证一些自定义约束

如何打印密码组合(但每个索引都有自定义约束)