如何注册自定义约束
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 返回一个列表或字符串。所有这些都是有用的解决方法,但不能回答最初的问题。以上是关于如何注册自定义约束的主要内容,如果未能解决你的问题,请参考以下文章