Как получить данные формы в виде карты в Spring MVC controller?

#java #spring #spring-mvc

#java — язык #весна #spring-mvc #java #spring

Вопрос:

У меня есть сложная HTML-форма, которая динамически создается с помощью Java script.

Я хочу получить карту пар ключ-значение в виде карты в java и сохранить их.

вот мой контроллер для получения отправленных данных.

 @RequestMapping(value="/create", method=RequestMethod.POST, 
    consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(Hashmap<String, Object) keyVals) {
    ....
}  
  

но моя карта пуста.

Как я могу получить данные формы в виде сопоставления пар имя-значение в контроллере Spring mvc?

Комментарии:

1. Добавьте @RequestParam в аргумент вашего метода.

2. Я не знаю, как называется параметр! я нашел решение своей проблемы, опубликованное ниже.

3. Вам не нужно имя параметра, только аннотация. @RequestParam на карте типов будут указаны все параметры запроса.

4. да, это сработало; Я только что протестировал ваше решение, все в порядке, и оно определенно лучше моего. Но есть проблема, при множественном выборе значений возвращается только первый выбранный элемент! не все выбранные значения!! когда я получаю параметры из HttpServletRequest, мультиселекты работают нормально! есть идеи??

5. Вместо Map использования MultiValueMap .

Ответ №1:

Вы также можете использовать @RequestBody с MultiValueMap , например

 @RequestMapping(value="/create",
                method=RequestMethod.POST,
                consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(@RequestBody MultiValueMap<String, String> formData){
 // your code goes here
}
  

Теперь вы можете получить имена параметров и их значения.

Многозначная карта находится в пакете Spring utils

Комментарии:

1. Я получаю проблему «Тип контента не поддерживается»

2. Убедитесь, что тип содержимого — application /x-www-form-urlencoded, что избавило от типа содержимого, который не поддерживается.

3. С моей стороны, я застрял, поскольку я перешел на Spring Boot 2.6. В полученной переменной @RequestBody нет данных.

Ответ №2:

Я только что нашел решение

 @RequestMapping(value="/create", method=RequestMethod.POST, 
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(HttpServletRequest request) {
    Map<String, String[]> parameterMap = request.getParameterMap();
    ...
}
  

таким образом, у меня есть карта представленных параметров.

Ответ №3:

Попробуйте это,

 @RequestMapping(value = "/create", method = RequestMethod.POST, 
        consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String createRole(@RequestParam HashMap<String, String> formData) {
  

Ответ №4:

Приведенные выше ответы уже правильно указывают на то, что аннотация @RequestParam отсутствует. Просто чтобы добавить, почему это требуется,

Простой запрос GET был бы чем-то вроде :

 http://localhost:8080/api/foos?id=abc
  

В контроллере нам нужно сопоставить параметр функции с параметром в запросе GET. Итак, мы записываем контроллер как

 @GetMapping("/api/foos")
@ResponseBody
public String getFoos(@RequestParam String id) {
    return "ID: "   id;
}
  

и добавьте @RequestParam для сопоставления параметра «id».

Комментарии:

1. Мне нравится отвечать на вопрос «почему», спасибо за это. ваше объяснение было бы улучшено, если бы оно было в контексте вопроса OP, в частности, запроса POST.