2014-07-02 2 views
4

J'ai essayé d'utiliser une variable de chemin dans le contrôleur de grails mais je ne suis pas capable de l'atteindre. L'intention est de valider le paramètre soumis à l'URL que je dois rendre obligatoire. Je ne pouvais pas le faire via RequestParam donc je suis passé à PathVariable de sorte que l'url soumise sans le param requis soit filtrée par le contrôleur de grails lui-même plutôt que moi ajoutant if/else vérifie la validité.Comment est-ce que je peux employer des variables de chemin dans le contrôleur de grails?

Donc, je peux illustrer comme ci-dessous: Mon URL est quelque chose comme ci-dessous: -

'<appcontext>/<controller>/<action>?<paramName>=<something>' 

Maintenant, pour faire 'paramName' obligatoire je ne trouve pas une façon Grails (Spring MVC fournit @RequestParam annotation qui peut me permettre de 'requis' comme vrai).

Une autre alternative que j'ai pensé était d'utiliser des variables de chemin afin que 'paramName' puisse être inclus dans l'URL elle-même. J'ai donc essayé comme suit:

'<appcontext>/<controller>/<action>/$paramName' 

Pour valider l'URL ci-dessus, j'ai écrit cartographie spécifique, mais certains comment cela ne fonctionne pas trop ..

la mise en correspondance qui suit est spécifique, j'ai écrit: -

"/<controllerName>/<action>/$paramName" { 
      controller:<controller to take request> 
      action:<action to do task> 
      constraints { 
       paramName(nullable: false,empty:false, blank: false) 
      } 
     } 

J'ai essayé d'utiliser l'annotation de printemps comme @PathVariable et @RequestParam dans le contrôleur comme indiqué ci-dessous: -

def action(@PathVariable("paramName") String param){ 
     //code goes here 
    } 
+0

"comment ça ne marche pas trop" - qu'est-ce qui ne va pas? N'oubliez pas que les contraintes déterminent simplement si ce mappage d'URL particulier peut ou non s'appliquer à une demande donnée. Si vous avez d'autres mappages qui pourraient correspondre à la même URL (par exemple le mappage générique '" $ controller/$ action?/$ Id? "'), Il se peut que vos contraintes fonctionnent correctement, rejetant ce mappage particulier, mais le même contrôleur est appelé à travers un mappage différent à la place. –

+0

Contraindre le paramètre avec 'nullable: false, vide: false, vide: false' ne fait vraiment rien. Puisque le mappage n'inclut pas de '?', Le paramètre doit être présent pour que ce mappage s'applique. Vous pouvez éliminer ces contraintes. –

Répondre

11

Si vous nommez l'argument de la méthode même que le paramètre de demande renommage, Grails prendra soin pour vous ...

// In UrlMappings.groovy 
"/foo/$someVariable/$someOtherVariable" { 
    controller = 'demo' 
    action = 'magic' 
} 

Ensuite, dans votre contrôleur:

// grails-app/controllers/com/demo/DemoController.groovy 
class DemoController { 
    def magic(String someOtherVariable, String someVariable) { 
     // a request to /foo/jeff/brown will result in 
     // this action being invoked, someOtherVariable will be 
     // "brown" and someVariable will be "jeff" 
    } 
} 

J'espère que aide .

EDIT:

Une autre option ...

Si pour une raison quelconque, vous voulez des noms différents pour les arguments de la méthode que vous pouvez mapper explicitement un argument de méthode pour un paramètre de demande comme celui-ci ...

import grails.web.RequestParameter 
class DemoController { 
    def magic(@RequestParameter('someVariable') String s1, 
       @RequestParameter('someOtherVariable') String s2) { 
     // a request to /foo/jeff/brown will result in 
     // this action being invoked, s2 will be 
     // "brown" and s1 will be "jeff" 
    } 
} 
+0

Merci @jeff ça a marché !! – Vishal

+0

cela a fonctionné, mais je me sens un peu bidouille car je voulais un comportement où si la contrainte échouait, la requête ne devrait pas passer. Mais ici, c'est comme si cela correspond à une action dans le contrôleur qui a le même nom alors la requête passera.Comment puis-je demander à la requête de ne pas effectuer d'autre action (autre que le mappage d'URL) sans modifier le nom d'action par défaut? – Vishal

+0

Je ne comprends pas votre question. Aucune requête ne parviendra jamais à l'action dans votre contrôleur à moins qu'elle ne corresponde à un mappage correspondant défini dans vos URLMappings. Par exemple, si vous supprimez le mappage '/ $ controller/$ action?/$ Id?' ​​Et que vous avez juste le mappage d'URL défini ci-dessus, une requête vers '/ foo/jeff/brown' fonctionnera mais'/demo/magie/'ne le sera pas. '/ Demo/magic? SomeVariable = jeff & someOtherVariable = brown' ou '/ demo/magic/jeff/brown' etc. Les seules requêtes qui" passent "sont celles qui correspondent à un mappage d'URL. –

Questions connexes