Передача нескольких переменных в @RequestBody Ajax в Spring MVC
Быстрый ответ
Чтобы передать несколько переменных, вам следует создать POJO и применить его как @RequestBody
. Таким образом, вы сможете отправить все данные одним объектом, сформированным в Ajax-запросе.
// POJO содержащий переменные
public class DataBundle {
private String text;
private int number;
// ... геттеры и сеттеры ...
}
// Метод контроллера в Spring
@PostMapping("/processData")
public void handleData(@RequestBody DataBundle data) {
// Обработка данных через data.getText(), data.getNumber()
}
Теперь создайте JSON, соответствующий вашему POJO, и отправьте его при помощи jQuery Ajax:
$.ajax({
url: '/processData',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({ text: 'example', number: 42 }),
success: function() { /* Обработка успешного завершения */ }
});
Альтернативы для большей гибкости: когда POJO не подходят
Если POJO кажется вам избыточным, рассмотрите варианты для более гибкого решения:
Использование Map вместе с @RequestBody: удивительная простота
Применяйте Map
, если вам не нужно POJO:
@PostMapping("/processDataMap")
public void handleDataMap(@RequestBody Map<String, Object> dataMap) {
// Ваши данные под рукой, используйте ключи 'text' и 'number'
}
ObjectNode из Jackson для сложных структур
Если при работе со сложными или динамическими JSON-структурами ObjectNode
обычно становится решением:
@PostMapping("/processDataDynamic")
public void handleDataObjectNode(@RequestBody ObjectNode objectNode) {
// Тут лучше использовать objectNode.get("text")
}
Индивидуальное решение с HandlerMethodArgumentResolver
Для полной кастомизации можно определить собственный HandlerMethodArgumentResolver
:
public class CustomDataBundleResolver implements HandlerMethodArgumentResolver {
// Опишите здесь логику извлечения данных из запроса.
}
Затем добавьте его в конфигурацию Spring MVC.
Визуализация
Αjax-запрос к контроллеру Spring MVC с @RequestBody
можно представить как "доставку" товаров, вот так:
{ "sugar": 2, "spice": 3, "berries": 5 } :🚚 ➡️ 🍮
# Передаем несколько параметров одним пакетом для их последующей обработки.
Ajax-запрос это ваш "доставщик":
🚚: $.ajax({
type: "POST",
contentType: "application/json",
url: "/bakery",
data: JSON.stringify(basket),
...
});
Качественная упаковка гарантирует успешную доставку.
Приоритет безопасности: надёжное управление параметрами запроса
Безопасность превыше всего при работе с @RequestBody
Наличие надежного фильтра и обработка входящих данных обеспечивает безопасность:
public class SafeDataBundle {
@NotNull
private String safeText;
@Min(0)
private int safeNumber;
// методы получения и изменения данных с добавленными проверками
}
Сочетание: комбинирование разных параметров запроса
Используйте @RequestBody
в сочетании с @RequestParam
или @PathVariable
при работе со встроенными типами:
@PostMapping("/processDataMix/{pathId}")
public void handleDataMix(@PathVariable int pathId,
@RequestParam String query,
@RequestBody DataBundle data) {
// Теперь у нас есть и путь, и параметры запроса, и тело запроса
}
Мастер-класс: сложные сценарии обработки данных
Для сложных структур JSON или выборочной сериализации используйте Jackson Mix-in аннотации или JSON Views.
Полезные материалы
- Spring MVC – создание REST-контроллеров: официальная документация Spring — Дельные советы по созданию REST-контроллеров.
- Подробное руководство по использованию аннотации @RequestBody в Spring — Глубокое погружение в работу с
@RequestBody
. - Spring MVC Test Framework: тестирование контроллеров с помощью MockMvc — Руководство по использованию MockMvc для проверки навыков работы со Spring MVC.
- Обработка нескольких Ajax-запросов на сохранение — Разбираем на практике реализацию множественного сохранения данных через Ajax.