我们正在尝试在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
(而无需重置默认/自动字段值)。有没有简单的方法可以做到这一点?
更新: 我已经考虑过以下选项,该选项几乎可以满足我的要求,但不完全可以。问题在于,它以as
@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做到这一点,我将不胜感激!
我刚刚遇到了同样的问题。我当前的解决方案如下所示。我还没有做过多的测试,但是经过初步检查,它似乎运行得很好。
@Autowired ObjectMapper objectMapper;
@Autowired UserRepository userRepository;
@RequestMapping(value = "/{id}", method = RequestMethod.POST )
public @ResponseBody ResponseEntity<User> update(@PathVariable Long id, HttpServletRequest request) throws IOException
{
User user = userRepository.findOne(id);
User updatedUser = objectMapper.readerForUpdating(user).readValue(request.getReader());
userRepository.saveAndFlush(updatedUser);
return new ResponseEntity<>(updatedUser, HttpStatus.ACCEPTED);
}
ObjectMapper是类型为org.codehaus.jackson.map.ObjectMapper的bean。
希望这对某人有帮助,
编辑:
遇到子对象问题。如果子对象接收到要部分更新的属性,它将创建一个新的对象,更新该属性并进行设置。这将擦除该对象上的所有其他属性。如果遇到干净的解决方案,我将进行更新。
我们正在尝试在Spring 3.2中实现一个特殊的部分更新功能。我们使用Spring作为后端,并有一个简单的Javascript前端。我无法找到一个直截了当的解决方案来满足我们的要求,即update()函数应该接受任意数量的字段:值并相应地更新持久性模型。 我们对所有字段都进行了在线编辑,因此当用户编辑字段并确认时,id和修改后的字段将作为json传递给控制器。控制器应该能够从客户端接收任意数量的
本文向大家介绍详解Vue 普通对象数据更新与 file 对象数据更新,包括了详解Vue 普通对象数据更新与 file 对象数据更新的使用技巧和注意事项,需要的朋友参考一下 最近在做一个多图片上传的组件,需求是做到多文件依次上传,并显示上传进度条。 逻辑部分实现了以后,在更新进度条视图的时候出现一点问题:动态计算生产的进度 progress 属性不会自动更新。 原来的代码是这样写的: 这里直接将 f
主要内容:示例对象数据绑定是指将JSON映射到任何JAVA对象。 示例 让我们看看对象数据绑定的行动。 这里将JAVA对象直接映射到JSON,反之亦然。参考实现代码:GsonTester.java - 执行上面示例代码,得到以下结果 -
问题内容: 我在ElasticSearch中将以下文档编入索引 我想进行部分更新以清空嵌套属性,所以我应该这样做;因此,我尝试发送部分更新: 但是,此操作无济于事,文档保持不变。如何使用部分更新清空文档中的嵌套对象? 问题答案: 我建议像这样进行脚本更新,它将起作用:
问题内容: 我遇到了一个mongo问题。我想知道是否有办法做一个蒙戈控制台命令而不是多个以下和电话。 我想用这个新的数组项更新对象 我使用了此方法,它是有限的,如果它已经存在,它不会将一个项目插入数组,但不会基于标识符更新项目。在这种情况下,我真的很想根据来更新此条目。 这给了我: 当我真正想要的是: 问题答案: 您可以使用位置运算符执行此操作: 的在更新对象充当的第一个元素的占位符到查询选择器相
问题内容: 我想做如下的部分更新。添加一些新字段,例如Bytes_In和Bytes_Out。并且还运行脚本来更新使用脚本从其他字段派生的字段。 脚本session-duration-script.groovy在/ config / scripts路径下。 当我运行上述更新查询时,出现此错误 请让我知道有办法实现这种更新。 问题答案: 由于错误状态,您不能同时使用和。我的建议是修改脚本,以添加所需的