2013-01-17 14 views
10

Sto tentando di accedere a grailsApplication in classe groovy sotto src/groovy ma ottengo un'eccezione di puntatore nullo. Ho anche provato a iniettare un servizio nella stessa classe e nello stesso risultato. Come posso accedere a grailsApplication o un servizio dalla classe groovy? (Sto usando Grails 1.3.7)Access grailsApplication o Service in groovy class

+0

possibile duplicato del [Grails iniezione servizio 2.x in Groovy/src] (http://stackoverflow.com/questions/10640480/grails-2-x-service-injection-in-groovy-src) – ataylor

risposta

5

L'iniezione di dipendenza non funziona con le classi groovy sotto src/groovy. È possibile ottenere l'accesso al grailsApplication utilizzando ApplicationHolder come questo:

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

def grailsApplication = ApplicationHolder.application 

È possibile accedere a tutti i servizi come questo:

def allServicesArtefacts = grailsApplication.services 
+0

ha funzionato come un incantesimo! Molte grazie ! –

+3

Per Grails 1.3.7 è una soluzione perfetta. Tuttavia per grails v2 + dovresti usare la soluzione di Tobias Kraft. – Archer

9

La classe ApplicationHolder è deprecato nelle versioni più recenti Grails (2.0 e superiori).

C'è un altro modo, che è descritto in una delle blogposts Burt: http://burtbeckwith.com/blog/?p=1017

+1

ottime informazioni! Grazie! – Archer

+1

Mi chiedo perché abbiano deprecato i loro possessori e poi ci hanno detto di scrivere i nostri stessi titolari. Se il modello non è difettoso, perché non hanno semplicemente corretto la loro implementazione? –

+5

Il post sul blog viene spesso eliminato: per motivi di posterità, includi la risposta effettiva nel tuo post, non solo un link! – nickdos

2

Se si dispone di classi che si desidera partecipare con l'iniezione di dipendenza da src/barattoli groove o src/java o anche 3rd party tutti voi è necessario configurarli in grails-app/conf/spring/resources.groovy.

Se tu avessi le mypackage.MyClass classe nella directory src/groove che si presentava così:

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

Poi aggiungendo quanto segue al graal-app/conf/primavera/resoruces.groovy otterrebbe auto-iniettato:

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

Ciò funzionerà in qualsiasi versione di graal thusfar, e come ho detto si può anche utilizzare 3rd vasetti parti - per esempio ho sempre la seguente nel mio resources.groovy:

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

Per più completa Primavera/documentazione Grails vedere:

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

1

Dopo Grails 2.0, è necessario utilizzare:

def grailsApplication = Holders.grailsApplication