0

在一个 grails 2.4.4 项目中,我能够在域属性上定义自己的自定义约束(称为“supportsToUrl”),并将其用作标记来控制 GSP 中的呈现逻辑。

GSP渲染代码:

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

域类约束:

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

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

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

4

2 回答 2

0

因此,基于ConstrainedDelegate 类,我认为简短的回答是这是不可能的。ConstrainedDelegate 不公开 MetaConstraints 映射或DefaultConstrainedProperty的属性映射。我将保留这个问题,但希望对 Grails 架构路线图更了解的人可以解释原因

与此同时,我能够通过重新利用格式约束并将格式与我的预定义标签进行比较来组合出一个解决方案。虽然我很想听听其他关于如何实现我最初目标的想法,因为这显然不是格式的预期使用方式。

于 2018-02-22T14:29:12.753 回答
0

您仍然可以在 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())
            }
        }
    }
}

请注意,它只看到来自域/实体(抽象或非抽象)的约束,这些约束标记有此Validateable特征。类层次结构将不适用 - 当根/超类实现它时,顶级类的约束仍然不可见,直到您也将其标记为Validateable

于 2018-05-18T06:31:23.470 回答