2010-03-17 4 views
14

Je souhaite utiliser un service dans mon application Grails. Cependant, c'est toujours nul. J'utilise Grails version 1.1. Comment puis-je résoudre ce problème?Utilisation du service grails dans la classe de domaine

Exemple de code:

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

Puis-je utiliser un service dans une classe de domaine?

Répondre

24

Cela devrait fonctionner. Notez que puisque vous utilisez 'def', vous n'avez pas besoin de l'ajouter à la liste des transitoires. Essayez-vous d'y accéder à partir d'une méthode statique? C'est un champ d'instance, donc vous ne pouvez y accéder qu'à partir d'instances.

Le cas d'utilisation typique pour l'injection d'un service dans une classe de domaine est la validation. Un validateur personnalisé est transmis l'instance de classe de domaine en cours de validation, afin que vous puissiez accéder au service depuis que:

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

Salut J'essaie d'y accéder à partir de def onLoad = {} closure. – DonX

+3

Il semble que l'injection de dépendance se produise après l'événement onLoad, vous devrez donc le retirer du contexte de l'application à la place. Ajouter cette importation: "importer org.codehaus.groovy.grails.commons.ApplicationHolder comme AH" et puis dans votre onLoad vous pouvez référencer le service comme "def testService = AH.application.mainContext.testService" –

10

Réponse courte est. Oui, vous pouvez utiliser le service dans la classe de domaine.

Voici un exemple de code dans lequel la classe de domaine obtient l'accès au service d'authentification à partir du plugin acegi. Cela fonctionne sans problèmes.

class Deal { 
    def authenticateService 

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

Ceci est en fait la meilleure réponse ! J'ai tout fait à l'envers. Je n'aurais pas dû essayer d'accéder à la base de données à partir du service, je devrais injecter le service dans la classe Domain et exécuter le code avec les «triggers» de grails comme afterInsert, comme vous le faites remarquer. –

1

Pour résumer les réponses et Burt Remis: Dans le domaine validateur personnalisé, vous devez utiliser obj.testService plutôt que d'utiliser directement testService. Si vous voulez un service d'utilisation dans le domaine validateur personnalisé:

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

Mais dans d'autres méthodes, y compris afterInsert et d'autres méthodes privées/publiques, utilisez testService est très bien.

def someMethod() { 
    def user = testService.serviceMethod(); 
    .... 
} 
Questions connexes