2012-05-17 17 views
12

Me gustaría inyectar mi servicio en la clase Groovy/src. La inyección de dependencias normaln no funciona:Grails inyección de servicio 2.x en Groovy/src

... 
def myService 
... 

soy capaz de utilizar este (funciona):

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

pero el ApplicationHolder está en desuso. ¿Hay alguna solución mejor?

Gracias por cualquier sugerencia

+0

¿Cómo se usa esta 'clase src'? ¿Dónde y cómo lo instancias? –

+0

Lo uso dentro de otras clases de Groovy (se crea una instancia allí). Hay una clase groovy fachada que es utilizada por un servicio lo que desencadena todos los procedimientos. No quiero pasar el servicio usado como parámetros para no pasar tantos parámetros ... – kuceram

Respuesta

12

Comprobar siguiente Preguntas frecuentes sobre Grails para obtener acceso al contexto de la aplicación de las fuentes en src/groovy - http://grails.org/FAQ#Q: ¿Cómo obtengo acceso al contexto de la aplicación desde fuentes en src/groovy?

No hay ninguna clase ApplicationContextHolder equivalente a ApplicationHolder. Para acceder a una clase de servicio denominada EmailService de una clase maravillosa en src/maravilloso, acceder al grano de primavera usando:

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

Si bien esto le permitirá acceder a métodos en un servicio, romperá la transaccionalidad de los servicios. Extracto de [Transacciones declarativas] (http://grails.org/doc/latest/guide/services.html#declarativeTransactions): *** Advertencia: la inyección de dependencia es la única forma en que funcionan las transacciones declarativas. No obtendrá un servicio transaccional si utiliza el nuevo operador, como el nuevo BookService() *** – ubiquibacon

+3

@ubiquibacon - sí, pero "def emailService = ctx.emailService" será un servicio transaccional.Lo siento, pero ¿cuál es el problema con acceder a un servicio como este? – Saurabh

+0

No creo que califique como "inyección de dependencia". Tendré que hacer algunas pruebas para verificar eso. – ubiquibacon

2

Puede registrar fácilmente nuevos (o anular existente) habas de configuración de los mismos en grails-app/conf/spring/resources.groovy:

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

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

También puede comprobar esta pregunta acerca de How to access Grails configuration in Grails 2.0?

+0

Ahora veo que esto no funciona para mí. No puedo obligar a un servicio u otras propiedades en resources.groovy como éste: ' com.path.to.ResidentAtPlace importación frijoles = { residentAtPlaceBean (ResidentAtPlace) { \t \t someProperty = 45 placeService = ref ('placeService') \t \t grailsApplication = ref ('grailsApplication') }} ' Todo es nula en mi ResidentAtPlace.groovy ¿ve algún problema? Estoy usando Grail 2.0.3 – kuceram

+0

, me pasa lo mismo, ¿alguna idea de por qué? – mathifonseca

28

La sustitución de ApplicationHolder puede ser Holders, que también se puede utilizar en su alcance estática:

import grails.util.Holders 
... 

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

funciona en Grails 3.0 también! – boraas

2

Yo puede hacerlo desde la resources.groovy:

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

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

o simplemente utilizando el anotation autowired:

// 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) {} 
} 
Cuestiones relacionadas