当前位置: 首页 > 面试题库 >

Spring部分更新对象数据绑定

步炯
2023-03-14
问题内容

我们正在尝试在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,并填写iddisplayNameCustomObjectMerger将此内容updateUserdbUser数据库中的相应内容合并,从而更新中包含的唯一字段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路径下。 当我运行上述更新查询时,出现此错误 请让我知道有办法实现这种更新。 问题答案: 由于错误状态,您不能同时使用和。我的建议是修改脚本,以添加所需的