概述
我们正在尝试在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 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: 我've already considered the following option which does almost what I'米要求,但不完全 . 问题是它将更新数据作为 @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 update(@ModelAttribute("user") User updateUser){
....
}
我已经考虑重新编写我的 customObjectMerger() 以更合适地使用JSON,计算并仅考虑来自 HttpServletRequest 的字段 . 但是,即使不得不首先使用 customObjectMerger() ,当 Spring 天提供的几乎正是我正在寻找的东西时,也会感到hacky,减去缺少的JSON功能 . 如果有人知道如何让Spring做到这一点,我将非常感激!
最后
以上就是糊涂宝贝为你收集整理的java更新部分数据_Spring部分更新对象数据绑定的全部内容,希望文章能够帮你解决java更新部分数据_Spring部分更新对象数据绑定所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复