Подтвердить что ты не робот

Как передать параметр после массива в Spring MVC

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

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

Я пробовал:

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

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

Любые идеи будут очень признательны!

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

@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

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

Входы формы:

<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 может искать связанные объекты для нас. Поэтому, если мы предположим, что входы форм выше символов Contais User как значения, тогда мы можем просто записать это в контроллер:

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

Сладкий не так ли?

Ответ 5

@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 будет разделять эту строку и создавать массив с двумя элементами "foo" и "baa". Поэтому будьте осторожны с запятыми, когда ваш массив может иметь и один элемент.

Ответ 6

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 -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 =>{
// ...
})