2010-08-29 10 views
1

Dans un projet Service of Grails, j'aime trouver, lors de l'exécution, les arguments de Dynamic Methods afin d'informer les appelants.Métaprogrammation groovy

Aussi, j'aime appeler la méthode et si n'existe pas retourner une erreur,

je vais appeciate toute aide.

+1

peut vous fournir quelques détails sur la première partie de la question? Si c'est une méthode dynamique, où va le code pour obtenir les arguments? –

Répondre

0

Je ne suis pas sûr de comprendre votre question, mais la dernière partie sur la vérification de l'appel d'une méthode sur un objet peut être effectuée en vérifiant la méta-classe de l'objet concerné.

obj.metaClass.respondsTo(obj, 'theMethodYouWantToCall') 

obj est l'objet que vous voulez appeler la méthode sur et theMethodYouWantToCall est le nom de la méthode que vous voulez appeler. respondsTo va retourner une liste vide [] si la méthode que vous essayez d'appeler est introuvable

+0

Merci pour votre réponse rapide. Que j'aime faire est de mettre en place une couche de repos qui recevra des demandes qui correspondront à des méthodes dynamiques comme ../ Account/findAllWhere? ... Je n'aime pas construire les services correspondants, mais le contrôleur va le gérer dynamiquement. – nick

2

Vous pouvez configurer des URLMappings dans Grails pour obtenir la valeur de la méthode dynamique et l'appeler par exemple avec votre objet. suivant

  • Dans votre urlMappings.groovy définir un mappage avec deux variables intégrées objet et la méthode

    "/ objet $/méthode $" (contrôleur: "api", action: "invoquer")

  • Définir un contrôleur 'api' avec une action d'invocation. Voir ci-dessous le code de la logique sur la façon d'invoquer la méthode sur l'objet

    import org.codehaus.groovy.grails.commons.ApplicationHolder as AH 
    class ApiController { 
        def invoke = { 
         def object = params.object 
         def method = params.method 
         def args 
         if(object) { 
          def domainClass = AH.application.domainClasses.find{it.name == method}?.clazz 
          if(domainClass.metaClass.getStaticMetaMethod(method,args)) { 
           domainClass.metaClass.invokeStaticMethod(target,input.method,args) 
          } 
         } 
        } 
    } 
    

Dans mon exemple, je suppose que vous appelez un chercheur dynamique statique sur la classe de domaine. Vous pouvez généraliser ceci pour gérer les méthodes d'instance. Vous devez toutefois fournir plus d'informations, telles que l'ID de l'objet, dans votre requête pour charger l'objet et appeler la méthode par rapport à celui-ci.

"/$object/$id/$method" (controller:"api",action:"invoke") 

-Ken

+0

Même si cela ne répond pas à la question, j'aime vraiment l'idée. One Up. – omarello

+0

Basé ma réponse plus sur ses commentaires sur votre réponse :) – ken

Questions connexes