Grails 6中如何判断PersistentProperty是否为受约束属性?
在Grails 6中判断PersistentProperty是否为受约束属性
可以通过Grails提供的grailsApplication获取Domain类的约束配置,来判断指定属性是否受约束。以下是实现isContrainedProperty方法的代码:
import grails.core.GrailsApplication import grails.validation.ConstrainedProperty import org.grails.datastore.mapping.model.PersistentProperty // 确保grailsApplication已注入到当前类中(比如Service、Controller或Domain类) GrailsApplication grailsApplication boolean isContrainedProperty(PersistentProperty property) { // 获取属性所属的Domain实体类 Class<?> domainClass = property.owner.javaClass // 获取该实体类的所有约束映射 Map<String, ConstrainedProperty> constraints = grailsApplication.getConstraints(domainClass) // 检查当前属性对应的约束是否存在 ConstrainedProperty constrainedProp = constraints.get(property.name) if (!constrainedProp) { return false } // 基础判断:只要属性存在约束定义(包括Grails默认添加的约束)就返回true return true // 可选进阶逻辑:仅当存在**非默认自定义约束**时返回true // 取消下面注释即可启用该逻辑 /* return constrainedProp.appliedConstraints.any { appliedConstraint -> !appliedConstraint.isDefault() } */ }
代码说明
- 先通过
PersistentProperty的owner拿到所属Domain类,再用grailsApplication.getConstraints()获取该类的全部约束配置。 - 若属性名对应的
ConstrainedProperty不存在,说明该属性无任何约束配置。 - 基础逻辑会把Grails默认添加的约束(比如默认的
nullable: false)也算作受约束;如果需要仅识别自定义配置的约束,可启用注释里的进阶判断。
原代码修正
你原代码中使用find只会返回第一个符合条件的元素,若要获取所有受约束属性,需替换为findAll:
List<PersistentProperty> persistentProperties = grailsApplication.mappingContext.getPersistentEntity("Entity").persistentProperties List<PersistentProperty> constrainedProperties = persistentProperties.findAll { isContrainedProperty(it) }
内容的提问来源于stack exchange,提问作者SMH MN
相关产品推荐
相关产品推荐

