2012-05-17 4 views
12

Ich möchte meinen Dienst in Groovy/src-Klasse injizieren. Die normaln Dependency Injection funktioniert nicht:Grails 2.x Service-Injektion in Groovy/src

... 
def myService 
... 

Ich bin in der Lage, diese zu verwenden (es funktioniert):

def appCtx = ApplicationHolder.application.getMainContext() 
def myService = appCtx.getBean("myService"); 

aber die ApplicationHolder veraltet. Gibt es eine bessere Lösung?

Vielen Dank für jede Anregung

+0

Wie verwenden Sie diese 'src-Klasse'? Wo und wie Sie es instanziieren? –

+0

Ich verwende es innerhalb von anderen Groovy-Klassen (es wird dort instanziiert). Es gibt eine Fassade groovy Klasse, die von einem Service verwendet wird, was alle diese Verfahren auslöst. Ich will den gebrauchten Dienst nicht als Parameter übergeben, um nicht so viele Parameter zu passieren ... – kuceram

Antwort

12

prüfen Grails FAQ zum Zugriff auf den Anwendungskontext von Quellen in src/groovy - http://grails.org/FAQ#Q: Wie bekomme ich Zugriff auf den Anwendungskontext von Quellen in src/groovy?

Es gibt keine ApplicationContextHolder-Klasse, die ApplicationHolder entspricht. Für den Zugriff auf eine Dienstklasse Emailservice aus einer Groovy Klasse in src/groovy genannt, greifen Sie auf den Spring-Bean mit:

import org.codehaus.groovy.grails.web.context.ServletContextHolder as SCH 
import org.codehaus.groovy.grails.web.servlet.GrailsApplicationAttributes as GA 
def ctx = SCH.servletContext.getAttribute(GA.APPLICATION_CONTEXT) 
def emailService = ctx.emailService 
+1

Während dies den Zugriff auf Methoden in einem Service ermöglicht, wird die Servicetransaktionalität beeinträchtigt. Auszug aus [Declarative Transactions] (http://grails.org/doc/latest/guide/services.html#declarativeTransactions): *** Warnung: Die Abhängigkeitsinjektion ist die einzige Möglichkeit für deklarative Transaktionen. Sie erhalten keinen Transaktionsservice, wenn Sie den neuen Operator wie zB BookService() verwenden. *** – ubiquibacon

+3

@ubiquibacon - yes, aber "def emailService = ctx.emailService" ist ein Transaktionsservice.Es tut mir leid, aber was ist das Problem beim Zugriff auf diesen Dienst? – Saurabh

+0

Ich denke nicht, dass dies als "Abhängigkeitsinjektion" qualifiziert. Ich muss einige Tests durchführen, um das zu überprüfen. – ubiquibacon

2

Sie können ganz einfach neue registrieren (oder überschreiben vorhandene) Bohnen von ihnen in grails-app/conf/spring/resources.groovy konfigurieren:

// src/groovy/com/example/MyClass.groovy 
class MyClass { 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) { 
     myService = ref('myService') 
    } 
} 

Sie können auch diese Frage prüfen folgendes über How to access Grails configuration in Grails 2.0?

+0

Jetzt sehe ich, dass das bei mir nicht funktioniert. Ich kann nicht einen Dienst oder andere Eigenschaften in resources.groovy wie diese binden: ' Import com.path.to.ResidentAtPlace Bohnen = { residentAtPlaceBean (ResidentAtPlace) { \t \t someProperty = 45 placeService = ref ('placeService') \t \t grailsApplication = ref ('grailsApplication') } } ' Alles ist in meinem ResidentAtPlace.groovy null Hast du irgendein Problem sehen? Ich benutze Gral 2.0.3 – kuceram

+0

das gleiche passiert mir, irgendeine Idee warum? – mathifonseca

28

Der Ersatz von ApplicationHolder Holders sein kann, Sie es auch im statischen Bereich verwenden können:

import grails.util.Holders 
... 

def myService = Holders.grailsApplication.mainContext.getBean 'myService' 
+0

funktioniert auch in Grails 3.0! – boraas

2

Yo kann es von der resources.groovy tun:

// src/groovy/com/example/MyClass.groovy 
class MyClass { 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) { 
     myService = ref('myService') 
    } 
} 

oder nur mit dem autowired den Vermerk:

// src/groovy/com/example/MyClass.groovy 

import org.springframework.beans.factory.annotation.Autowired 

class MyClass { 
    @Autowired 
    def myService 
    ... 
} 

// resources.groovy 
beans = { 
    myclass(com.example.MyClass) {} 
} 
Verwandte Themen