2011-06-14 167 views
18

我想让用户遍历域类并打印出垃圾信息。我弗里斯特问题:假设下面的作品就好了:Grails:按名称查找域名

//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字段。

回答

43

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

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) 
+0

我的错误(使用第二种方法和className =“Account”):无法将类'org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass'的对象'Artefact> Account'强制转换为'java.lang.Class'类,原因是:java.lang.ClassNotFoundException:Artefact >账号 – Mikey 2011-06-14 22:22:50

+0

对不起,我编辑了答案以从DomainClass获取Java类。 – 2011-06-15 04:49:03

+0

@burt:我相信,你在第一个例子的第二行错过了一个.clazz(就像你添加到第二个块)。不幸的是,[有趣的命名](http://grails.org/doc/latest/api/org/codehaus/groovy/grails/commons/AbstractGrailsClass.html#getClazz%28%29)阻止了我的编辑被批准:-) – martin 2012-08-24 11:16:06