146 votes

La liaison d'une liste de @RequestParam

Je suis l'envoi de certains paramètres à partir d'un formulaire de cette façon:

myparam[0]     : 'myValue1'
myparam[1]     : 'myValue2'
myparam[2]     : 'myValue3'
otherParam     : 'otherValue'
anotherParam   : 'anotherValue' 
...

Je sais que je peux obtenir tous les paramètres dans la méthode de contrôleur par l'ajout d'un paramètre comme la

public String controllerMethod(@RequestParam Map<String, String> params){
    ....
}

Je veux lier les paramètres myParam[] (pas les autres) à une liste ou un tableau (tout ce qui maintient l'ordre d'index), donc j'ai essayé avec une syntaxe du type:

public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
    ....
}

et

public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
    ....
}

mais aucun d'entre eux sont contraignantes pour l'myParams. Même quand j'ai ajouter une valeur à la carte, il n'est pas en mesure de lier les paramètres:

public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
    ....
}

Est-il une syntaxe de lier certains paramètres d'une liste ou d'une matrice, sans avoir à créer un objet en tant que @ModelAttribute avec un attribut de liste?

Merci

116voto

Bernhard Points 416

Ou vous pouvez simplement le faire de cette façon:

public String controllerMethod(@RequestParam(value="myParam[]") String[] myParams){
    ....
}

Que fonctionne par exemple pour des formes comme ceci:

<input type="checkbox" name="myParam[]" value="myVal1" />
<input type="checkbox" name="myParam[]" value="myVal2" />

C'est la solution la plus simple :)

90voto

axtavt Points 126632

Les tableaux en @RequestParam sont utilisés pour la liaison de plusieurs paramètres du même nom:

myparam=myValue1&myparam=myValue2&myparam=myValue3

Si vous avez besoin de lier @ModelAttribute-style indexé paramètres, je suppose que vous avez besoin d' @ModelAttribute de toute façon.

10voto

ggreiner Points 5795

Une façon, vous pourriez faire cela (dans un hackish moyen) est de créer une classe wrapper pour la Liste. Comme ceci:

class ListWrapper{
     List<String> myList; 
     // getters and setters
}

Ensuite, votre contrôleur de signature de la méthode devrait ressembler à ceci:

public String controllerMethod(ListWrapper wrapper){
    ....
}

Pas besoin d'utiliser le @RequestParam ou @ModelAttribute annotation si le nom de la collection vous passez dans la demande correspond à la collecte champ nom de la classe wrapper, dans mon exemple vos paramètres de la requête devrait ressembler à ceci:

myList[0]     : 'myValue1'
myList[1]     : 'myValue2'
myList[2]     : 'myValue3'
otherParam     : 'otherValue'
anotherParam   : 'anotherValue' 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X