2011-01-04 14 views
84

sto inviando alcuni parametri da un modulo in questo modo:Binding una lista in @RequestParam

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

so di poter ottenere tutti i params nel metodo di controllo con l'aggiunta di un parametro come

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

voglio associare i parametri myParam [] (non gli altri) ad una lista o array (tutto ciò che mantiene l'ordine di indice), quindi ho provato con una sintassi simile:

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

e

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

ma nessuno di loro sono vincolanti le myParams. Anche quando aggiungo un valore per la mappa non è in grado di legare i params:

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

C'è qualche sintassi per legare alcuni params ad una lista o un array senza dover creare un oggetto come @ModelAttribute con una lista attributo in esso?

Grazie

+0

non credo che questo è possibile. Il codice in 'HandlerMethodInvoker.resolveRequestParam' ottiene sempre il primo valore – skaffman

+0

La risposta di Bernhard ha funzionato per me. – theblang

+4

(* Spring Boot *): si tratta di 'method = RequestMethod.GET' o' method = RequestMethod.POST'? Se '.GET'' @RequestParam List groupVal' soddisfatto da '? GroupVal = kkk, ccc, mmm' con successo (* Spring Boot *) – basil

risposta

55

array in @RequestParam vengono utilizzate per legare diversi parametri con lo stesso nome:

myparam=myValue1&myparam=myValue2&myparam=myValue3 

Se hai bisogno di impegnare @ModelAttribute parametri indicizzati -style, immagino hai bisogno @ModelAttribute comunque.

+1

ci possono essere problemi con l'ordine (che è molto importante tenere nel mio caso) perché invio i parametri serializzando un modulo e inviando i con ajax. Userò il metodo "tradizionale" @ModelAttribute. – Javi

+0

Sapresti come costruire un URI con questo ordinamento con UriTemplate o altri mezzi? (per un cliente di questo tipo di risorsa). – Chomeh

+0

Rispondendo alla mia domanda, appare la molla UriTemplate non supporta RFC6570, usa l'implementazione damnhandy: http://stackoverflow.com/questions/14153036/how-to-send-array-with-spring-resttemplate – Chomeh

8

Un modo in cui è possibile ottenere questo risultato (in un modo hacker) è creare una classe wrapper per l'elenco. Come questo:

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

Quindi il metodo di controllo della firma sarebbe simile a questa:

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

Non c'è bisogno di utilizzare il @RequestParam o @ModelAttribute annotazione se il nome della raccolta si passa nella richiesta corrisponde la collezione nome del campo della classe wrapper, nel mio esempio tuoi parametri della richiesta dovrebbe essere simile a questo:

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

Bene questo è quasi come usare @ModelAttribute, l'unica differenza è che il parametro non è annotato. Volevo evitare @ModelAttribute solo perché non volevo creare un wrapper. Ho letto da qualche parte in StackOverflow (non riesco a ricordare dove esattamente) che se aggiungi un parametro nel metodo controller senza l'annotazione @ModelAttribute (e non era un oggetto speciale come HttpRequest, HttpResponse ...) il framework lo tratta come se fosse annotato con @ModelAttribute. Quindi, se fosse vero, questo è esattamente come avere @ModelAttribute. Ma grazie per la tua risposta. – Javi

+0

myList [0] myList [1] è stato un ottimo aiuto per me. –

94

Oppure si potrebbe fare in questo modo:

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

che funziona per esempio, per le forme di questo tipo:

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

Questa è la soluzione più semplice :)

+4

mantiene l'ordine? –

+6

Sono stato in grado di utilizzare solo il nome piuttosto che [] in Spring 3.0: @RequestParam (value = "myParam") String [] myParams –

+2

Non condivido comunque i risultati di @MSmith. – droope

-3

Modificare il valore del campo nascosto con ginocchiera casella di controllo come qui di seguito ...

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'); 

    } 

} 
6

Proprio integrando ciò che Donal Fellows Detto questo, è possibile utilizzare List con @RequestParam

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

Speranza che aiuta !

0

Sottoscrivere ciò che il basilico ha detto in un commento alla domanda stessa, se method = RequestMethod.GET allora è possibile utilizzare @RequestParam List groupVal.

quindi chiamando il servizio con l'elenco dei params è semplice come:

API_URL?groupVal=kkk,ccc,mmm 
Problemi correlati