Grails 3.3.2 访问自定义元约束

Grails 3.3.2 accessing custom meta constraints

在 grails 2.4.4 项目中,我能够在域 属性 上定义自己的自定义约束(称为 'supportsToUrl')并将其用作标签来控制我的渲染逻辑普惠制

GSP 渲染代码:

if(domainClass.constraints[p.name].getMetaConstraintValue('supportsToUrl'))

域class约束:

static constraints = {
    embedCode(nullable:true, blank:true, unique:false, display:true, supportsToUrl:true)
}

Upgrading from Grails 3.2.x 部分 "Grails Validator and ConstrainedProperty API Deprecated" 中讨论了如何移动此功能。但是,我在新 API 中没有看到任何涉及元约束的内容。

我的问题是:如何访问 Grails 3.3.2 中的自定义约束?

所以基于ConstrainedDelegate class, I think the short answer is that it's not possible. ConstrainedDelegate does not expose the metaConstraints map or the attributes map of DefaultConstrainedProperty。我将保留这个问题,但希望对 Grails 体系结构路线图有更多了解的人可以解释 为什么

与此同时,我能够通过 re-purposing 格式约束并将格式与我的预定义标签进行比较来破解一个解决方案。尽管我很想听听有关如何实现我最初目标的其他想法,因为这显然不是格式的预期使用方式。

您仍然可以在 Grails 3.3 中访问元约束。* 来自 Validateable trait getConstraintsMap().

支持 url (supportsToUrl: true)

的所有属性的示例列表
Set<String> supportsUrlProperties = new HashSet<>()
Map<String, Constrained> constraints = domainObject.getConstraintsMap()
if(constraints) {
     constraints.values().each { Constrained constrained ->
        DefaultConstrainedProperty propertyToCheck = constrained.properties?.property as DefaultConstrainedProperty
        if(propertyToCheck) {
            def supportsToUrlConstraint = propertyToCheck.getMetaConstraintValue('supportsToUrl')
            if (supportsToUrlConstraint != null && BooleanUtils.isTrue(supportsToUrlConstraint as Boolean)) {
                supportsUrlProperties.add(propertyToCheck.getPropertyName())
            }
        }
    }
}

请注意,它只看到来自 domain/entity(抽象或非抽象)的约束,这些约束标有此 Validateable 特征。 Class 层次结构不适用 - 当 root/super class 实现它时,顶部 class 的约束仍然不可见,直到您也将其标记为 Validateable.