是否有办法访问域对象仅包含用户创建的域的元数据(缺少更好的单词),而不是域对象通过插件等集成到项目中?
我所追求的是在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),但这看起来非常脆弱。
答案 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>