2013-01-17 7 views
10

Próbuję uzyskać dostęp do grailsApplication w groovy klasy pod src/groovy, ale otrzymuję wyjątek wskaźnika pustego. Próbowałem również wprowadzić usługę do tej samej klasy i tego samego wyniku. Jak uzyskać dostęp do grailsApplication lub usługi z klasy groovy? (Używam Grails 1.3.7)Dostęp do grailsApplication lub Service w groovy klasie

+0

możliwe duplikat [Grails zastrzyku usług 2.x w Groovy/src] (http://stackoverflow.com/questions/10640480/grails-2-x-service-injection-in-groovy-src) – ataylor

Odpowiedz

5

Wstrzyknięcie zależności nie działa dla klas groovych pod src/groovy. Można uzyskać dostęp do grailsApplication wykorzystaniem ApplicationHolder takiego:

import org.codehaus.groovy.grails.commons.ApplicationHolder 

def grailsApplication = ApplicationHolder.application 

można uzyskać dostęp do wszystkich usług tak:

def allServicesArtefacts = grailsApplication.services 
+0

to działało jak czar! Wielkie dzięki ! –

+3

Dla grails 1.3.7 to idealne rozwiązanie. Jednak dla Grails v2 + powinieneś użyć rozwiązania od Tobias Kraft. – Archer

9

Klasa ApplicationHolder jest przestarzałe w nowszych wersjach Grails (2,0 i powyżej).

Jest też inny sposób, który jest opisany w jednym z Burta blogposts: http://burtbeckwith.com/blog/?p=1017

+1

świetne informacje! dzięki! – Archer

+1

Zastanawiam się, dlaczego wycofali swoich posiadaczy, a następnie kazali nam pisać własnych posiadaczy. Jeśli wzór nie jest wadliwy, dlaczego po prostu nie naprawili implementacji? –

+5

Post na blogu często zostaje usunięty - dla dobra potomności, proszę podać faktyczną odpowiedź w swoim poście, a nie tylko link! – nickdos

2

Jeśli masz zajęcia, które mają uczestniczyć z wstrzykiwania zależności od src/porywające lub src/JAVA lub nawet 3rd słoików wszystko co partyjnych musisz je skonfigurować w grails-app/conf/spring/resources.groovy.

Jeśli miał mypackage.MyClass klasy w katalogu src/groove, które wyglądały tak:

package mypackage 
class MyClass{ 
    def grailsApplication 
    def myMethod(){ 
     //uses grailsApplication 
    } 
} 

następnie dodanie następujących do grails-app/conf/wiosna/resoruces.groovy byłoby uzyskać auto-rdzeniowych:

myClass(mypackage.MyClass){bean-> 
    bean.autowire = "byName"  
} 

ta będzie działać w każdej wersji Grails thusfar, i jak powiedziałem można nawet użyć słoików 3rd party - na przykład zawsze mam następujących w moim resources.groovy:

jdbcTemplate(org.springframework.jdbc.core.JdbcTemplate){ 
    dataSource = ref('dataSource') 
} 

Dla bardziej kompleksowej Wiosna/dokumentacją Grails patrz:

http://grails.github.io/grails-doc/latest/guide/spring.html

1

Po Grails 2.0, należy użyć:

def grailsApplication = Holders.grailsApplication 
Powiązane problemy