2011-06-14 13 views
18

Kullanıcıların etki alanı sınıflarını geçmesine ve malzeme yığınlarını yazdırmasına izin vermek istiyorum. Benim Frist sorun: gayet aşağıdaki eserlerini varsayarak: Aşağıda söylemeye çalışıyorum neyi yazmak için uygun yolu nedirGrails: alana göre sınıf sınıfı bul

//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] 
    } 
} 

olanlar hatları yukarıda hiç çalışmaz. Kullanıcılara herhangi bir alan sınıfını seçme ve bir şeyi "şeyler" ile geri alma olanağı sağlamaya çalışıyorum. Varsayım: tüm alan sınıfları aynı türde bir Stuff alanına sahiptir. Tam paketi biliyorsanız

cevap

43

, bu kullanabilirsiniz:

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

Eğer paketleri kullanmak istemiyorsanız da işe edeceğimizi.

Eğer paketleri kullanırsanız ancak kullanıcılar sadece paket olmadan sınıf adını vereceğiz ve isimleri tüm paketler için benzersizdir, o zaman bu kullanabilirsiniz:

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

Ben ikinci yöntemi kullanarak (hatası alıyorum ve className = "Account"): 'java.lang.Class' sınıfına 'org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass' sınıfıyla 'Artefact> Account' nesnesini 'java.lang.ClassNotFoundException' olarak sınıflandıramazsınız: Artefact > Hesap – Mikey

+0

Maalesef, Java sınıfını DomainClass'tan almak için cevabı düzenledim. –

+0

Burt: Sanırım ilk örneğinizin ikinci satırında bir .clazz'ı kaçırdınız (tıpkı ikinci bloğa eklediğiniz gibi). Ne yazık ki [komik adlandırma] (http://grails.org/doc/latest/api/org/codehaus/groovy/grails/commons/AbstractGrailsClass.html#getClazz%28%29) düzenlememin onaylanmasını engelledi :-) – martin