2009-06-26 5 views
0

Dans une application Grails, j'aimerais ajouter une méthode foo() à toutes mes classes de contrôleurs. Je sais que je peux le faire en utilisant le code comme la fermeture à l'intérieur de doWithDynamicMethods d'un plug-in:Ajout de méthodes aux contrôleurs

application.controllerClasses.toList()*.metaClass*.foo = { println 'foo called' } 

Cependant, je ne veux pas créer un plug-in juste à cet effet. Y a-t-il d'autres endroits où je peux faire ça? Je soupçonne qu'il pourrait être possible dans le init fermeture de BootStrap.groovy, mais je ne sais pas comment accéder à l'instance GrailsApplication dans cette fermeture.

Merci, Don

+0

pourquoi ne pas écrire un plugin? c'est le type parfait d'usecase pour un plugin. Vous n'avez pas besoin de le libérer, ni d'un gros plugin. modulariser une application via des plugins est un idiome de grails que vous devriez suivre si vous le pouvez. – Chii

Répondre

2
def grailsApplication = org.codehaus.groovy.grails.commons.ApplicationHolder.application 
-2
class BootStrap { 
    def grailsApplication 

    def init = { servletContext -> 
     ... 
    } 
} 
+1

Qu'est-ce que cela signifie? – dmahapatro

0

La question a été posée il y a longtemps, donc ma réponse peut-être pas été possible à l'époque - mais maintenant il est Avril 2014. Ce code montre le plus simple façon d'ajouter une méthode pour tous vos contrôleurs (à partir de BootStrap.init):

grailsApplication.controllerClasses.each { controllerClass -> 
    if (controllerClass.clazz.name.contains("org.idurkan.foo")) { 
     controllerClass.metaClass.respondError = { String message, int status = 404 -> 
      response.status = status 
      render([errorMessage: message] as JSON) 
     } 
    } 
} 
  1. En BootSt rap.groovy, injectez grailsApplication comme ceci: def grailsApplication
  2. Faites un appel comme le mien ci-dessus, en substituant votre propre nom de paquet - pour éviter de jouer avec les classes des plugins.
  3. Maintenant, dans n'importe quel contrôleur, vous pouvez utiliser la fermeture repondError (l'invoquer comme une méthode).

Notez que cela n'ajoute pas une action! C'est juste une fermeture/méthode d'utilité disponible dans chaque contrôleur .

Questions connexes