Grails 5.0.1 如何获取Domain类的transient瞬态属性
Grails获取领域类transient属性的实现方案
你可以直接通过Grails核心的DomainClass API获取所有属性(包含持久化和transient属性),不需要依赖Hibernate专属的持久化实体类,该API原生支持scaffolding场景的属性遍历需求。
实现步骤
- 首先注入
grails.core.grailsApplicationBean,所有领域类的元数据都可以通过该实例获取 - 调用
grailsApplication.getDomainClass(你的领域类全限定名)拿到对应领域类的DomainClass实例 - 遍历
DomainClass的properties属性即可拿到所有字段,包括transient属性,如果要单独筛选transient字段可以结合isPersistent()方法判断:返回false的就是transient属性
示例代码
// 注入grailsApplication def grailsApplication // 获取指定Domain的元数据 def domainClass = grailsApplication.getDomainClass("com.example.YourDomain") // 遍历所有属性,筛选transient字段 def transientProperties = domainClass.properties.findAll { !it.persistent } // 如果你需要同时拿持久化和transient的所有属性 def allProperties = domainClass.properties
适配自定义scaffolding的优化方案
如果你是在自定义脚手架模板里调用,可以直接在模板上下文中获取domainClass实例,不需要额外注入Bean:
// scaffolding模板中直接遍历所有属性渲染 <% domainClass.properties.each { prop -> %> <div class="field"> <label>${prop.naturalName}</label> <g:field name="${prop.name}" value="${domainInstance?."${prop.name}"}" /> </div> <% } %>
注意:如果你的项目使用的是Grails 3+版本,API路径略有调整,对应类为
grails.core.DomainClass,用法完全一致,不需要修改逻辑。
内容的提问来源于stack exchange,提问作者Pedro Gentil
相关产品推荐
相关产品推荐

