2011-01-04 13 views
84

ich auf diese Weise einige Parameter aus einem Formular zu senden:Bindung eine Liste in @RequestParam

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

Ich weiß, dass ich alle params in der Controller-Methode wie

durch Hinzufügen eines Parameters bekommen
public String controllerMethod(@RequestParam Map<String, String> params){ 
    .... 
} 

ich möchte die Parameter binden myParam [] (nicht die anderen) zu einer Liste oder Array (alles, was den Index um hält), so habe ich mit einer Syntax versucht, wie:

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

und

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

aber keiner von ihnen sind verbindlich die myParams. Selbst wenn ich einen Wert der Karte hinzuzufügen, ist es nicht in der Lage, die params zu binden:

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

Gibt es eine Syntax einige params auf eine Liste oder Array zu binden, ohne ein Objekt als @ModelAttribute mit einer Liste erstellen mit Attribut darin?

Dank

+0

Ich glaube nicht, dass dies möglich ist. Der Code in 'HandlerMethodInvoker.resolveRequestParam' bekommt immer nur den ersten Wert – skaffman

+0

Bernhards Antwort funktionierte für mich. – theblang

+4

(* Spring Boot *): Ist über 'Methode = RequestMethod.GET' oder' Methode = RequestMethod.POST'? Wenn '.GET'' @RequestParam Liste groupVal' erfüllt von '? GroupVal = kkk, ccc, mmm' erfolgreich (* Spring Boot *) – basil

Antwort

55

Arrays in @RequestParam sind für die Bindung mehrerer Parameter mit dem gleichen Namen verwendet:

myparam=myValue1&myparam=myValue2&myparam=myValue3 

Wenn Sie @ModelAttribute -Stil indizierte Parameter zu binden, ich denke, Sie @ModelAttribute sowieso brauchen.

+1

kann es Probleme mit der Bestellung geben (was in meinem Fall sehr wichtig ist) weil ich die Parameter sende, indem ich ein Formular serialisiere und ich mit ajax sende. Ich werde den "traditionellen" @ModelAttribute Weg verwenden. – Javi

+0

Würdest du zufällig wissen, wie man einen URI mit dieser Zuordnung mit UriTemplate oder einem anderen Mittel erstellt? (für einen Client dieser Art von Ressource). – Chomeh

+0

Beantworten Sie meine eigene Frage, es erscheint der Frühling UriTemplate unterstützt RFC6570 nicht, verwenden Sie die Implementierung damnhandy: http://StackOverflow.com/Questions/14153036/How-to-send-array-with-spring-restTemplate – Chomeh

8

Eine Möglichkeit, dies (auf hackische Weise) zu erreichen, besteht darin, eine Wrapper-Klasse für die Liste zu erstellen. Wie folgt aus:

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

Dann würde Ihre Controller-Methode Signatur wie folgt aussehen:

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

Keine Notwendigkeit, die @RequestParam oder @ModelAttribute Annotation zu verwenden, wenn die Sammlung Namen, den Sie in der Anfrage übergeben Sie die Sammlung Spiele Feldname der Wrapper-Klasse, in meinem Beispiel Ihre Anfrage Parameter sollte wie folgt aussehen:

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

Nun, das ist fast identisch mit der Verwendung von @ModelAttribute. Der einzige Unterschied besteht darin, dass der Parameter nicht mit Anmerkungen versehen ist. Ich wollte @ModelAttribute vermeiden, nur weil ich keinen Wrapper erstellen wollte. Ich habe irgendwo in stackoverflow gelesen (ich kann mich nicht erinnern, wo genau), dass wenn Sie einen Parameter in der Controller-Methode ohne @ModelAttribute Annotation hinzufügen (und es war kein spezielles Objekt wie HttpRequest, HttpResponse ...) das Framework behandeln es als wenn es mit @ModelAttribute annotiert wurde. Wenn das also stimmt, ist das genau so, wie @ModelAttribute. Aber danke für deine Antwort. – Javi

+0

myList [0] myList [1] war eine sehr gute Hilfe für mich. –

94

Oder Sie könnten es nur tun, dass die Art und Weise:

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

die für Formulare wie dies zum Beispiel funktioniert:

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

Dies ist die einfachste Lösung :)

+4

hält das die Reihenfolge? –

+6

Ich konnte nur den Namen anstelle der [] im Frühjahr 3.0 soly verwenden: @RequestParam (Wert = "myParam") String [] myParams –

+2

Ich teile die Ergebnisse von @ MSmith jedoch nicht. – droope

-3

ändern verstecktes Feld Wert mit Checkbox Toggle wie unten ...

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

Gerade Ergänzung was Donal Fellows sagte, Sie Liste mit @RequestParam verwenden können

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

Hoffe, es hilft !

0

Subskribieren, was Basil in einem Kommentar zu der Frage selbst gesagt hat, wenn method = RequestMethod.GET dann können Sie @RequestParam List groupVal verwenden.

dann den Dienst mit der Liste der params Aufruf ist so einfach wie:

API_URL?groupVal=kkk,ccc,mmm 
Verwandte Themen