当前位置: 首页 > 知识库问答 >
问题:

Spring部分更新对象数据绑定

李成礼
2023-03-14

我们正在尝试在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);
    ...
}

这里的代码可以工作,但有一些问题:@Request estBody创建一个新的updateUser,填写iddisplayNameCustomObjectMerger将此updateUser与数据库中相应的dbUser合并,更新updateUser中包含的唯一字段。

问题是Spring使用默认值和其他自动生成的字段值填充updateUser中的某些字段,合并后会覆盖我们在dbUser中拥有的有效数据。显式声明它应该忽略这些字段不是一个选项,因为我们希望我们的更新也能够设置这些字段。

我正在寻找一种方法,让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){
....
}

我已经考虑重新编写我的CustomObjectMergement(),以便更恰当地使用JSON,计算并让它只考虑来自HttpServletRequest的字段。但是,当spring提供的几乎与我所看到的完全一样的功能,而缺少JSON功能时,即使首先必须使用CustomObjectMerge(),也会让人感觉不舒服。如果有人知道如何让Spring做到这一点,我将不胜感激!

共有3个答案

蒯宇定
2023-03-14

我构建了一个API,可以在调用persiste、merge或update之前将视图对象与实体合并。

这是第一个版本,但我认为这是一个开始。

只需在POJO的字段中使用注释UIAttribute,然后使用:

<代码>合并处理器。合并(pojoUi、pojoDb)

它适用于本机属性和集合。

git:https://github.com/nfrpaiva/ui-merge

宓昂雄
2023-03-14

我们正在使用@Model属性来实现您想要做的事情。

>

  • 创建一个带注释with@modelattribute的方法,该方法基于路径变量通过存储库加载用户

    创建一个带有参数的方法@计量映射

    这里的重点是@model属性方法是模型的初始化器。然后Spring将请求与此模型合并,因为我们在@Request est映射方法中声明了它。

    这为您提供了部分更新功能。

    有些人,甚至很多人?;)会争辩说这无论如何都是不好的做法,因为我们直接在控制器中使用我们的DAO,而不是在专用服务层中进行合并。但是目前我们并没有因为这个问题而遇到问题。

  • 吕越彬
    2023-03-14

    我刚刚遇到了同样的问题。我当前的解决方案如下所示。我还没有做太多的测试,但经过初步检查,它看起来工作得相当好。

    @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是ObjectMapper类型org.codehaus.jackson.map.bean。

    希望这对某人有帮助,

    编辑:

    遇到子对象问题。如果子对象接收到要部分更新的属性,它将创建一个新对象,更新该属性,然后对其进行设置。这将擦除该对象上的所有其他属性。如果我遇到干净的解决方案,我会更新。

     类似资料:
    • 问题内容: 我们正在尝试在Spring 3.2中实现特殊的部分更新功能。我们使用Spring作为后端,并且有一个简单的Javascript前端。我无法找到满足我们要求的简单解决方案,即 update()函数应采用任意数量的field:values并相应地更新持久性模型。 我们对所有字段进行了内联编辑,因此,当用户编辑字段并进行确认时,会将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路径下。 当我运行上述更新查询时,出现此错误 请让我知道有办法实现这种更新。 问题答案: 由于错误状态,您不能同时使用和。我的建议是修改脚本,以添加所需的