2010-03-17 9 views
14

Quiero usar un servicio en mi aplicación Grails. Sin embargo, siempre es nulo. Estoy usando la versión 1.1 de Grails. ¿Como puedó resolver esté problema?Uso del servicio de grillas en el dominio clase

Código de ejemplo:

class A{ 
     String name; 
     def testService; 
     static transients=['testService'] 
} 

¿Puedo usar un servicio dentro de una clase de dominio?

Respuesta

24

Eso debería funcionar. Tenga en cuenta que dado que está usando 'def' no necesita agregarlo a la lista de transitorios. ¿Estás tratando de acceder desde un método estático? Es un campo de instancia, por lo que solo puede acceder a él desde instancias.

El caso de uso típico para inyectar un servicio en una clase de dominio es para la validación. Un validador propio se pasa la instancia de clase de dominio que se está validando, para que pueda acceder al servicio desde que:

static constraints = { 
    name validator: { value, obj -> 
     if (obj.testService.someMethod(value)) { 
     ... 
     } 
    } 
} 
+0

Hola, estoy tratando de acceder desde def onLoad = {} closure. – DonX

+3

Parece que la inyección de dependencia ocurre después del evento onLoad, por lo que tendrá que extraerlo del contexto de la aplicación. Agregue esta importación: "import org.codehaus.groovy.grails.commons.ApplicationHolder as AH" y luego en su onLoad puede hacer referencia al servicio como "def testService = AH.application.mainContext.testService" –

10

respuesta corta es. Sí, puedes usar el servicio dentro de la clase de dominio.

Aquí hay un código de muestra en el que la clase de dominio obtiene acceso al servicio de autentificación desde el plugin de acegi. Funciona sin problemas

class Deal { 
    def authenticateService 

    def afterInsert() { 
     def user = authenticateService.userDomain(); 
     .... 
    } 
.... 
} 
+0

Esta es en realidad la mejor respuesta ! Tenía todo al revés. No debería haber intentado acceder a la base de datos desde el servicio, debería inyectar el servicio en la clase de dominio y ejecutar el código con los "desencadenantes" de grails como afterInsert, como usted señala. –

1

Para resumir Burt y Remis' respuestas: En el validador propio dominio, usted tiene que utilizar obj.testService en lugar de utilizar directamente testService. Si quieres servicio de uso en el validador propio dominio:

static constraints = { 
    name validator: { value, obj -> 
     if (obj.testService.someMethod(value)) { 
     ... 
     } 
    } 
} 

Pero en otros métodos, incluyendo afterInsert y otros métodos privadas/públicas, utiliza testService está muy bien.

def someMethod() { 
    def user = testService.serviceMethod(); 
    .... 
} 
Cuestiones relacionadas