Мы пытаемся реализовать специальную функцию частичного обновления в Spring 3.2. Мы используем Spring для бэкэнд и имеем простой интерфейс Javascript. Я не смог найти прямое решение для наших требований. Функция update() должна принимать любое количество полей: значения и соответственно обновлять модель сохранения.
У нас есть встроенное редактирование для всех наших полей, так что, когда пользователь редактирует поле и подтверждает, идентификатор и измененное поле передаются контроллеру как json. Контроллер должен иметь возможность принимать любое количество полей от клиента (от 1 до n) и обновлять только те поля.
например, когда пользователь с id == 1 редактирует свое имя displayName, данные, отправленные на сервер, выглядят следующим образом:
{"id":"1", "displayName":"jim"}
В настоящее время у нас есть неполное решение в UserController, как описано ниже:
@RequestMapping(value = "/{id}", method = RequestMethod.POST )
public @ResponseBody ResponseEntity<User> update(@RequestBody User updateUser) {
dbUser = userRepository.findOne(updateUser.getId());
customObjectMerger(updateUser, dbUser);
userRepository.saveAndFlush(updateUuser);
...
}
Код здесь работает, но имеет некоторые проблемы: @RequestBody
создает новый updateUser
, заполняет id
и displayName
. CustomObjectMerger
объединяет этот updateUser
с соответствующим dbUser
из базы данных, обновляя только поля, включенные в updateUser
.
Проблема заключается в том, что Spring заполняет некоторые поля в updateUser
значениями по умолчанию и другими автоматически генерируемыми значениями поля, которые после слияния перезаписывают действительные данные, которые у нас есть в dbUser
. Явно объявляя, что он должен игнорировать эти поля, не является вариантом, так как мы хотим, чтобы наш update
мог также установить эти поля.
Я изучаю, как Spring автоматически объединяет ТОЛЬКО информацию, явно отправленную в функцию update()
в dbUser
(без сброса значений по умолчанию/автоматического поля). Есть ли простой способ сделать это?
Обновление: Я уже рассмотрел следующий вариант, который делает почти то, о чем я прошу, но не совсем. Проблема в том, что он принимает данные обновления в виде @RequestParam
и (AFAIK) не выполняет строки JSON:
//load the existing user into the model for injecting into the update function
@ModelAttribute("user")
public User addUser(@RequestParam(required=false) Long id){
if (id != null) return userRepository.findOne(id);
return null;
}
....
//method declaration for using @MethodAttribute to pre-populate the template object
@RequestMapping(value = "/{id}", method = RequestMethod.POST )
public @ResponseBody ResponseEntity<User> update(@ModelAttribute("user") User updateUser){
....
}
Я подумал о том, чтобы переписать мой customObjectMerger()
более подходящим образом с JSON, подсчитывая и принимая во внимание только поля, поступающие из HttpServletRequest
. но даже использование customObjectMerger()
в первую очередь кажется взломанным, когда Spring обеспечивает практически то, что я ищу, минус отсутствие функций JSON. Если кто-нибудь знает, как получить Spring, чтобы это сделать, я был бы очень признателен!