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.
在 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.