2011-06-14 302 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