Grails:按名称查找域类

Posted

技术标签:

【中文标题】Grails:按名称查找域类【英文标题】:Grails: find domain class by name 【发布时间】:2011-09-14 08:29:23 【问题描述】:

我想允许用户遍历域类并打印出东西的转储。我的第一个问题:假设以下工作正常:

//this works
class EasyStuffController
  def quickStuff = 
    def findAThing = MyDomainClass.findByStuff(params.stuff)
    [foundThing:findAThing]
  

在下面写下我想说的话的正确方法是什么:

//this doesn't
class EasyStuffController servletContext ->
  def quickStuff = 
    def classNameString = "MyDomainClass" //or params.whichOne something like that
    def domainHandle = grailsApplication.domainClasses.findByFullName(classNameString)
    //no such property findByFullName
    def findAThing = domainHandle.findByStuff(params.stuff)
    [foundThing:findAThing]
  




//this also doesn't
class EasyStuffController servletContext ->
  def quickStuff = 
    def classNameString = "MyDomainClass" //or params.whichOne something like that
    def domainHandle 
    grailsApplication.domainClasses.each
      if(it.fullName==classNameString)domainHandle=it
    
    def findAThing = domainHandle.findByStuff(params.stuff)
    //No signature of method: org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass.list() is applicable
    [foundThing:findAThing]
  

上面的那些行根本不起作用。我试图让用户能够选择任何域类并用“东西”取回东西。假设:所有域类都有一个相同类型的 Stuff 字段。

【问题讨论】:

【参考方案1】:

如果你知道完整的包,你可以使用这个:

String className = "com.foo.bar.MyDomainClass"
Class clazz = grailsApplication.getDomainClass(className).clazz
def findAThing = clazz.findByStuff(params.stuff)

如果你不使用包,这也可以。

如果你使用包,但用户只提供类名而不提供包,并且名称在所有包中都是唯一的,那么你可以使用这个:

String className = "MyDomainClass"
Class clazz = grailsApplication.domainClasses.find  it.clazz.simpleName == className .clazz
def findAThing = clazz.findByStuff(params.stuff)

【讨论】:

我得到错误(使用第二种方法和 className="Account"):无法将对象 'Artefact > Account' 与类 'org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass' 转换为类'java.lang.Class' 由于:java.lang.ClassNotFoundException: Artefact > Account 抱歉,我编辑了答案以从 DomainClass 中获取 Java 类。 @burt:我相信,您在第一个示例的第二行中错过了一个 .clazz(就像您添加到第二个块中一样)。不幸的是,funny naming 阻止了我的编辑被批准:-) 这种方法在 2.3.x 以后的版本中是否仍然适用? 看起来和 grails 3 一样,如果你不使用包指定类名,getArtefact 方法不起作用

以上是关于Grails:按名称查找域类的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Grails 错误:“找不到名称 PrivacyOptions 的域类。请重试并输入有效的域类名称”

Grails 多列索引

在另一个域类中查看 grails 域类属性

如何从 Grails 控制器和视图外部引用 Grails 域类字段?

Grails,Field 的域类默认值

grails:将 SQL 转换为域类