Grails:按名称查找域类

Grails:按名称查找域类,grails,grails-domain-class,servlets,Grails,Grails Domain Class,Servlets,我希望允许用户遍历域类并打印出转储的内容。我的第一个问题是:假设以下各项工作正常: //this works class EasyStuffController{ def quickStuff = { def findAThing = MyDomainClass.findByStuff(params.stuff) [foundThing:findAThing] } } 写下我想说的话的正确方式是什么: //this doesn't class EasyStuffCont

我希望允许用户遍历域类并打印出转储的内容。我的第一个问题是:假设以下各项工作正常:

//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”取回内容。假设:所有域类都有一个相同类型的stuff字段。

如果您知道完整的包,您可以使用:

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)
如果您不使用软件包,这也会起作用

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

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”):无法将类为“org.codehaus.groovy.grails.commons.DefaultGrailDomainClass”的对象“Artefact>Account”强制转换为类“java.lang.class”,原因是:java.lang.ClassNotFoundException:Artefact>Account抱歉,我编辑答案是为了从DomainClass中获取Java类。@burt:我相信,您在第一个示例的第二行中漏掉了一个.clazz(就像您添加到第二个块中一样)。不幸的是,阻止我的编辑被批准:-)这种方法在2.3.x之后的版本中仍然适用吗?与grails 3类似,如果不在包中指定类名,则getArtefact方法不起作用