我们正在尝试在 Spring 3.2 中实现一个特殊的部分更新功能。我们使用 Spring 作为后端,并有一个简单的 Javascript 前端。我无法找到满足我们要求的直接解决方案,即update() 函数应该接受任意数量的字段:值并相应地更新持久性模型。
我们对所有字段进行了内联编辑,因此当用户编辑字段并确认时,id 和修改后的字段作为 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
问题是 SpringupdateUser
使用默认值和其他自动生成的字段值填充了一些字段,这些字段在合并时会覆盖我们在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 功能时,即使必须首先使用 a 也会让人感觉很糟糕。如果有人知道如何让 Spring 做到这一点,我将不胜感激!