Przesyłam parametry z formularza w ten sposób:
myparam[0] : 'myValue1'
myparam[1] : 'myValue2'
myparam[2] : 'myValue3'
otherParam : 'otherValue'
anotherParam : 'anotherValue'
...
Wiem, że mogę uzyskać wszystkie parametry w metodzie kontrolera, dodając parametr taki jak
public String controllerMethod(@RequestParam Map<String, String> params){
....
}
Chcę powiązać parametry myParam [] (nie inne) z listą lub tablicą (cokolwiek, co zachowuje kolejność indeksów), więc próbowałem użyć składni takiej jak:
public String controllerMethod(@RequestParam(value="myParam") List<String> myParams){
....
}
i
public String controllerMethod(@RequestParam(value="myParam") String[] myParams){
....
}
ale żaden z nich nie wiąże myParams. Nawet gdy dodam wartość do mapy, nie jest w stanie powiązać parametrów:
public String controllerMethod(@RequestParam(value="myParam") Map<String, String> params){
....
}
Czy istnieje jakakolwiek składnia do wiązania niektórych parametrów z listą lub tablicą bez konieczności tworzenia obiektu jako @ModelAttribute z atrybutem listy w nim?
Dzięki
HandlerMethodInvoker.resolveRequestParam
tylko zawsze otrzymuje pierwszą wartośćmethod = RequestMethod.GET
lubmethod = RequestMethod.POST
? Jeśli.GET
@RequestParam List<String> groupVal
spełniony z?groupVal=kkk,ccc,mmm
powodzeniem ( Spring Boot )Odpowiedzi:
Tablice w programie
@RequestParam
służą do wiązania kilku parametrów o tej samej nazwie:Jeśli potrzebujesz powiązać
@ModelAttribute
parametry indeksowane w stylu, myślę, że i@ModelAttribute
tak potrzebujesz .źródło
Lub możesz to zrobić w ten sposób:
Działa to na przykład w przypadku takich formularzy:
To najprostsze rozwiązanie :)
źródło
List<String>
. Możliwe jest również zdobycie fasoli javaList<MyBean>
Uzupełniając tylko to, co powiedział Donal Fellows, możesz użyć List z @RequestParam
Mam nadzieję, że to pomoże!
źródło
Subskrybowanie tego, co powiedziała bazylia w komentarzu do samego pytania, jeśli
method = RequestMethod.GET
możesz użyć@RequestParam List<String> groupVal
.Wtedy wywołanie serwisu z listą parametrów jest tak proste, jak:
źródło
Jednym ze sposobów, w jaki można to osiągnąć (w hakerski sposób), jest utworzenie klasy opakowującej dla
List
. Lubię to:Wtedy podpis metody kontrolera wyglądałby następująco:
Nie ma potrzeby używania adnotacji
@RequestParam
lub,@ModelAttribute
jeśli nazwa kolekcji, którą przekazujesz w żądaniu, jest zgodna z nazwą pola kolekcji klasy opakowania, w moim przykładzie parametry żądania powinny wyglądać następująco:źródło
Nie było dla mnie oczywiste, że chociaż możesz zaakceptować Collection jako parametr żądania, ale po stronie konsumenta nadal musisz przekazywać elementy kolekcji jako wartości oddzielone przecinkami .
Na przykład, jeśli interfejs API po stronie serwera wygląda następująco:
Bezpośrednie przekazanie kolekcji do RestTemplate jako RequestParam, jak poniżej, spowoduje uszkodzenie danych
Zamiast tego możesz użyć
Kompletny przykład można znaleźć tutaj , mam nadzieję, że oszczędza to komuś bólu głowy :)
źródło
Zmień wartość ukrytego pola za pomocą przełącznika pola wyboru, jak poniżej ...
HTML:
Scenariusz:
źródło