在Grails中获取用户创建的域类的域名

时间:2012-03-14 03:32:30

标签: grails

是否有办法访问域对象仅包含用户创建的域的元数据(缺少更好的单词),而不是域对象通过插件等集成到项目中?

我所追求的是在gsp文件中获取各种gui相关活动(建筑菜单等)的域对象名称。

所以,如果我做这样的事情:

<%
    for( domain in grailsApplication.domainClasses ){
        print ( '<h3>domain class locgial property name: ' + domain.logicalPropertyName + '</h3>' )
        print ( '<h3>domain  full name: ' + domain.fullName + '</h3>' )
    }
%>

...我可以获取名称,在JS中破解它们以确定它们是否属于我自己生成的包(例如com.ra),但这看起来非常脆弱。

2 个答案:

答案 0 :(得分:2)

Grails 3.3.11中,我能够找到域类的列表,如下所示。

List<GrailsClass> getDomainClasses() {
    Holders.grailsApplication.getArtefacts("Domain").findAll {
        it.pluginName == null
    }.toList()
}

要查找控制器类的列表,以下方法可能会有所帮助。

List<GrailsClass> getControllerClasses() {
    Holders.grailsApplication.getArtefacts("Controller").findAll {
        it.pluginName == null
    }.toList()
}

要仅获取用户创建的域类的名称,请使用以下代码。

List<String> getDomainClassesNames() {
    Holders.grailsApplication.getArtefacts("Domain").findAll {
        it.pluginName == null
    }.collect {it.shortName }.toList()
}

要使用域类的属性,您可以考虑使用以下代码

List<MetaProperty> findDomainClassProperties(GrailsClass domainClass) {
    return domainClass.metaClass.properties
}

答案 1 :(得分:0)

插件类的编译器添加了org.codehaus.groovy.grails.plugins.metadata.GrailsPlugin注释,因此您只需将应用程序的域类从控制器传递到模型中的GSP,如下所示:

import org.codehaus.groovy.grails.plugins.metadata.GrailsPlugin

class MyController {

   def myAction = {
      ...
      def appDomainClasses = grailsApplication.domainClasses.findAll {
         !it.clazz.isAnnotationPresent(GrailsPlugin)
      }
      [appDomainClasses: appDomainClasses]
   }
}

然后在GSP中循环遍历它们:

<g:each var='dc' in='${appDomainClasses}'>
<h3>domain class logical property name: ${dc.logicalPropertyName}</h3>
<h3>domain full name: ${dc.fullName}</h3>
</g:each>