Как передать параметр массива записей в Spring MVC - PullRequest
40 голосов
/ 23 марта 2011

Мне было просто интересно, как передать параметры записи, такие как следующие выдержки из опций html, обычно я получаю массив на языке, таком как php (POST['param'][0]... будет работать, я считаю)

url?param=value1&param=value2&param=value3

Я пытался:

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(String[] param)

Но по какой-то причине это не работает ...

Любые идеи будут с благодарностью!

Ответы [ 6 ]

49 голосов
/ 10 декабря 2012

Вы можете использовать это:

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(@RequestParam(value = "param[]") String[] paramValues){...}

будет извлекать все значения (внутри массива paramValues) параметра param (обратите внимание на атрибут value из RequestParam: заканчивается [])

8 голосов
/ 03 апреля 2011

Это должно работать:

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(@RequestParam("param") String[] param)
5 голосов
/ 16 сентября 2017

Если кто-то все еще борется с этим, вот как это должно быть сделано:

Ввод формы:

<input name="myParam" value="1"/>
<input name="myParam" value="4"/>
<input name="myParam" value="19"/>

Метод контроллера:

   @RequestMapping
    public String deletePlaces(@RequestParam("myParam") Long[] myParams) {

      //myParams will have 3 elements with values 1,4 and 19
    }

Этоработает так же для String[] Integer[] Long[] и, возможно, больше.POST, GET, DELETE будут работать так же.

Имя параметра должно совпадать с тегом name из формы ввода.Никаких дополнительных [] не требуется и т. Д. Фактически, имя параметра может быть опущено, если имя аргумента метода совпадает с именем ввода, поэтому мы можем получить сигнатуру метода, подобную этой:

   @RequestMapping
   public String deletePlaces(@RequestParam Long[] myParams) 

, и это будетвсе еще работает

Нечто дополнительное: Теперь, если у вас есть модель предметной области, скажем, Place, а у вас есть PlaceRepository, предоставив Place#id в качестве значения ваших входных данных, Spring может выполнить поиск, связанный собъекты для нас.Так что, если мы предположим, что входные данные формы выше содержат идентификаторы пользователей в качестве значений, то мы можем просто записать это в контроллер:

public String deletePlaces(@RequestParam Place[] places) {
  //places will be populated with related entries from database!
 }

Не правда ли?

5 голосов
/ 23 марта 2011

Если вы знаете свое имя параметра, попробуйте

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(@RequestParam("myParam") String param)

Другой способ - использовать текущий объект запроса:

@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(HttpServletRequest request) {
Map parameterMap = request.getParameterMap();
...

}
4 голосов
/ 12 марта 2016
@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(@RequestParam(value = "param[]") String[] paramValues {...}

Это будет работать, когда вы отправляете, например, ajax с помощью jQuery:

$.ajax({
    type: "POST",
    data: { param:paramValues }
    ...
});

, но когда вы отправляете только один элемент массива с String, который содержит запятые, такие как "foo, baa", Spring будетразделите эту строку и создайте массив с 2 элементами "foo" и "baa".Поэтому будьте осторожны с запятыми, когда в вашем массиве может быть также один элемент.

0 голосов
/ 15 декабря 2018

1, добавьте Java-класс как requestBody

public class PostMembers {
    private String[] members;

    public String[] getMembers() {
        return members;
    }

    public void setMembers(String[] members) {
        this.members = members;
    }
}

2, добавьте метод в классе контроллера

@PostMapping("")
public List<SomeClass> addMember(@RequestBody PostMembers postMembers) {
// ...
}

теперь ваш контроллер может получить параметры массива.

3, тест с curl

curl -H "Content-Type:application/json"  \
 -X POST -d '{"members":["item1","item2"]}' \
 http://localhost:8080/api/xxx

или если вы используете vue

axios.post(someUrl,{
    members:[
       'item1','item2'
    ]
}).then(response =>{
// ...
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...