Как передать параметр после массива в Spring MVC
Мне просто интересно, как передать параметры сообщения, такие как выполнение exercept из html-параметров, обычно я получаю массив на языке, например php (POST['param'][0]...
будет работать, я считаю)
url?param=value1¶m=value2¶m=value3
Я пробовал:
@RequestMapping(value="/schedule", method = RequestMethod.POST)
public void action(String[] param)
Но по какой-то причине это не работает...
Любые идеи будут очень признательны!
Ответы
Ответ 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 =>{
// ...
})