Wie zu injizieren Grails services in src/groovy-Klassen
Grails 2.4.x hier. Wenn ich ein Grails-service mit grails create-service com.example.Widget
, dann wie kann ich Spritzen eine Referenz des service ("bean") in einer Klasse unter src/groovy
?
Dies ist eigentlich nicht erklärt, überall in der offiziellen Grails-docs und umfangreiche Suche wandte sich wieder nadda.
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) Sie können Spring Beans zu injizieren ein service in einen nicht-Artefakt groovy-Datei mit
resources.groovy
:MyClass.groovy
Ressourcen.groovy
2) Es gibt auch eine zusätzliche
@Autowired
Anmerkung, die dasselbe tun können:MyClass.groovy
Ressourcen.groovy
Bemerken - dieses mal die
myclass
bean muss nicht der Verweis auf diewidget
.3) gibt Es eine alternative zur Injektion der
WidgetService
- mit derHolders
- Klasse, um dengrailsApplication
mit einem Verweis auf die bestehende bean.**Update**
4) Es ist eine weitere option, die ein hybrid aus 1) und 2) -
Mit der bean(s) injiziert, die durch
autowire=true
innerhalb Ressourcen.groovy:MyClass.groovy
Ressourcen.groovy
Dies ist der Ansatz, den ich habe mit lokal, wie ich finde, es ist die sauberste, aber Sie es nicht mehr Vorteil des Gral 's ' magic' (für besser oder schlechter).
grails run-app
:Error loading Config.groovy: Cannot get property 'mainContext' on null object
...irgendwelche Ideen?!?widgetService
null innerhalbMyClass
zur Laufzeit.FizzBuzzer
Klasse mit einemstatsService
argument, Grails verwendet Feld-Injektion, so können Sie diese entfernen, es sei denn, Sie planen nicht mit dependency injection und die Instanziierung derFizzBuzzer
sich mit dem notwendigen service.statsService
zustatisticsService
innerhalb Ihrer Groovy-Klasse zu vermeiden alle potenziellen Probleme, die eine nicht übereinstimmende Namen - obwohl, wenn Sieresources.groovy
und eine expliziteref()
dies sollte keine Rolle spielen.Bootstrap#init
führt? Wenn Sie geschehen nachdemBootstrap#init
, dann habe ich mein problem gelöst: ich bin aufrufenMyClass
Methoden imBoostrap#init
, und so Grails noch nicht hatte eine chance zu injizierenMyClass
mit einem gültigenWidgetService
noch. Gedanken?!?Holders.grailsApplication.mainContext.getBean('widgetService')
funktioniert, wenn ich darauf verweisen, nachdem die app schon gestartet. Aber, wenn ich versuche, eine Referenz von einer Methode direkt aufgerufenBootstrap#init
, diegrailsApplication
NULL ist, die erklärt, dass die Ausnahme in meinem ersten Kommentar oben. So, jetzt das problem bei der hand ist: Wie kann ich den Zugriff auf dieWidgetService
Bohne von innenBootstrap.groovy#init
?widgetService
bean vom Typcom.example.myapp.WidgetService
aus, dasssprintContext
variable...springContext.getBean('widgetService')
! Boom! Vielen Dank für alle Hilfe!def WidgetService
innerhalb von Bootstrap sollte für sich arbeiten.