Предположим, у меня есть страница со списком объектов на таблице, и мне нужно поместить форму для фильтрации таблицы. Фильтр отправляется в виде Ajax GET на URL-адрес, подобный следующему: http://foo.com/system/controller/action?page=1&prop1=x&prop2=y&prop3=z
И вместо того, чтобы иметь много параметров на моем контроллере, как:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "prop1", required = false) String prop1,
@RequestParam(value = "prop2", required = false) String prop2,
@RequestParam(value = "prop3", required = false) String prop3) { ... }
И предположим, у меня есть MyObject как:
public class MyObject {
private String prop1;
private String prop2;
private String prop3;
//Getters and setters
...
}
Я хочу сделать что-то вроде:
@RequestMapping(value = "/action")
public @ResponseBody List<MyObject> myAction(
@RequestParam(value = "page", required = false) int page,
@RequestParam(value = "myObject", required = false) MyObject myObject,) { ... }
Является ли это возможным? Как я могу это сделать?
java
spring-mvc
renanleandrof
источник
источник
@ModelAttribute
, Пример обработки форм Spring MVC . Просто зайдите в Google « Обработка форм Spring MVC », и вы получите массу учебников / примеров. Но обязательно используйте современный способ обработки форм, то есть Spring v2.5 +@ModelAttribute
в Spring MVCОтветы:
Вы можете сделать это абсолютно просто, просто удалите
@RequestParam
аннотацию, Spring аккуратно свяжет параметры вашего запроса с экземпляром вашего класса:источник
MyObject
этого, аналогичным образом мы можем сделать с @RequestParam?MyObject
чтобы принимать параметры запроса в случае Снейка и сопоставить его с членом дела верблюдаMyObject
. Например,?book_id=4
должен быть сопоставлен сbookId
членомMyObject
?Я добавлю несколько коротких примеров от меня.
Класс DTO:
Отображение запроса внутри класса контроллера:
Запрос:
Результат:
Я надеюсь, что это помогает :)
ОБНОВЛЕНИЕ / КОТЛИН
Потому что в настоящее время я много работаю с Kotlin, если кто-то хочет определить аналогичный DTO, класс в Kotlin должен иметь следующую форму:
С таким
data
классом:Spring (протестирован в Boot) возвращает следующую ошибку для запроса, упомянутого в ответе:
Класс данных будет работать только для следующей формы параметров запроса:
Будьте в курсе этого!
источник
У меня очень похожая проблема. На самом деле проблема глубже, как я думал. Я использую jquery,
$.post
который используетContent-Type:application/x-www-form-urlencoded; charset=UTF-8
по умолчанию. К сожалению, я основывал свою систему на этом, и когда мне был нужен сложный объект,@RequestParam
я не мог просто заставить его произойти.В моем случае я пытаюсь отправить пользовательские настройки с чем-то вроде;
На стороне клиента фактические необработанные данные отправляются на сервер;
разобрано как;
и на стороне сервера есть;
Я попытался
@ModelAttribute
, добавил сеттер / геттеры, конструкторы со всеми возможностями,UserPreferences
но без шансов, поскольку он распознал отправленные данные как 5 параметров, но на самом деле отображенный метод имеет только 2 параметра. Я также попробовал решение Biju, однако в результате Spring создает объект UserPreferences с конструктором по умолчанию и не заполняет данные.Я решил проблему, отправив строку предпочтений JSon со стороны клиента и обработал ее, как если бы это была строка на стороне сервера;
клиент:
сервер:
вкратце, я сделал преобразование вручную внутри метода REST. По моему мнению, причина, по которой Spring не распознает отправленные данные, заключается в типе контента.
источник
@RequestMapping(method = POST, path = "/settings/{projectId}") public void settings(@PathVariable String projectId, @RequestBody ProjectSettings settings)
Поскольку вопрос о том, как устанавливать обязательные поля, появляется под каждым постом, я написал небольшой пример того, как устанавливать поля по мере необходимости:
источник
В то время как ответы , которые относятся к
@ModelAttribute
,@RequestParam
,@PathParam
и любит справедливы, есть небольшой глюк я столкнулся. Результирующий параметр метода - это прокси, который Spring оборачивает вокруг вашего DTO. Таким образом, если вы попытаетесь использовать его в контексте, который требует вашего собственного пользовательского типа, вы можете получить неожиданные результаты.Следующее не будет работать:
В моем случае попытка использовать его в привязке Джексона привела к
com.fasterxml.jackson.databind.exc.InvalidDefinitionException
.Вам нужно будет создать новый объект из dto.
источник
Да, Вы можете сделать это простым способом. Смотрите ниже код линий.
URL - http: // localhost: 8080 / get / request / multiple / param / by / map? Name = 'abc' & id = '123'
источник
Принятый ответ работает как талисман, но если у объекта есть список объектов, он не будет работать должным образом, так что вот мое решение после некоторого копания.
Следуя этой теме , вот как я это сделал.
Это не лучший способ отладки вашего API с почтальоном, но он работает, как и ожидалось.
А вот SearchFilterDTO и FilterDTO
источник