我们正在尝试在 Spring 3.2 中实现一个特殊的部分更新功能。我们使用 Spring 作为后端,并有一个简单的 Javascript 前端。我无法找到满足我们要求的直接解决方案,即update() 函数应该接受任意数量的 field:values 并相应地更新持久性模型。
我们对所有字段进行内联编辑,这样当用户编辑字段并确认时,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
.
问题是Spring填充了一些字段updateUser
具有默认值和其他自动生成的字段值,合并后会覆盖我们在其中的有效数据dbUser
。明确声明它应该忽略这些字段不是一个选择,因为我们希望我们的update
也能够设置这些字段。
我正在寻找某种方法让 Spring 仅自动合并显式发送到的信息update()
函数进入dbUser
(无需重置默认/自动字段值)。有什么简单的方法可以做到这一点吗?
Update:我已经考虑过以下选项,它几乎可以满足我的要求,但不完全是。问题是它需要更新数据@RequestParam
并且(据我所知)不处理 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()
首先,当春天提供时,感觉很糟糕几乎正是我想要的,减去缺少 JSON 功能。如果有人知道如何让 Spring 做到这一点,我将不胜感激!