Enlazar una lista en @RequestParam


Estoy enviando algunos parámetros desde un formulario de esta manera:

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

Sé que puedo obtener todos los parámetros en el método controlador agregando un parámetro como

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

Quiero enlazar los parámetros myParam [] (no los otros) a una lista o matriz (cualquier cosa que mantenga el orden del índice), así que he intentado con una sintaxis como:

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

Y

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

Pero ninguno de ellos ata a los myParams. Incluso cuando agrego un valor al mapa no es capaz de enlazar el parámetros:

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

¿Existe alguna sintaxis para enlazar algunos parámetros a una lista o matriz sin tener que crear un objeto como @ModelAttribute con un atributo list?

Gracias

Author: Javi, 2011-01-04

6 answers

Los arrays en @RequestParam se utilizan para enlazar varios parámetros del mismo nombre:

myparam=myValue1&myparam=myValue2&myparam=myValue3

Si necesitas enlazar parámetros indexados de estilo @ModelAttribute, supongo que necesitas @ModelAttribute de todos modos.

 59
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-11 17:25:15

O simplemente podrías hacerlo de esa manera:

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

Que funciona por ejemplo para formas como esta:

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

Esta es la solución más simple:)

 102
Author: Bernhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-11 15:54:39

Simplemente complementando lo que dijeron los Becarios Donales, puede usar la lista con @RequestParam

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

Espero que ayude!

 11
Author: Jorge Peres,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-17 19:53:55

Una forma de lograr esto (de una manera hackish) es crear una clase wrapper para el List. Así:

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

Entonces la firma del método controlador se vería así:

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

No es necesario usar la anotación @RequestParam o @ModelAttribute si el nombre de la colección que pasa en la solicitud coincide con el nombre del campo de la colección de la clase wrapper, en mi ejemplo, los parámetros de la solicitud deberían tener este aspecto:

myList[0]     : 'myValue1'
myList[1]     : 'myValue2'
myList[2]     : 'myValue3'
otherParam    : 'otherValue'
anotherParam  : 'anotherValue'
 9
Author: ggreiner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-25 13:31:07

Suscribiendo lo que basil dijo en un comentario a la pregunta en sí, si method = RequestMethod.GET puede usar @RequestParam List<String> groupVal.

Entonces llamar al servicio con la lista de parámetros es tan simple como:

API_URL?groupVal=kkk,ccc,mmm
 1
Author: Juangui Jordán,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 12:31:26

Cambie el valor del campo oculto con la casilla de verificación como se muestra a continuación...

HTML:

<input type='hidden' value='Unchecked' id="deleteAll" name='anyName'>
<input type="checkbox"  onclick="toggle(this)"/> Delete All

Script:

function toggle(obj) {`var $input = $(obj);
    if ($input.prop('checked')) {

    $('#deleteAll').attr( 'value','Checked');

    } else {

    $('#deleteAll').attr( 'value','Unchecked');

    }

}
 -3
Author: Khomeni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-01 19:09:25