gpt4 book ai didi

java - Spring 部分更新对象数据绑定(bind)

转载 作者:IT老高 更新时间:2023-10-28 13:48:07 28 4
gpt4 key购买 nike

我们正在尝试在 Spring 3.2 中实现一个特殊的部分更新功能。我们使用 Spring 作为后端,并有一个简单的 Javascript 前端。我无法找到满足我们要求的直接解决方案,即 update() 函数应该接受任意数量的 field:values 并相应地更新持久性模型。

我们对所有字段进行了内联编辑,因此当用户编辑字段并确认时,id 和修改后的字段会以 json 格式传递给 Controller ​​。 Controller 应该能够从客户端接收任意数量的字段(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 >显示名称CustomObjectMerger 将此 updateUser 与数据库中相应的 dbUser 合并,更新 updateUser 中包含的唯一字段。

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

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

我考虑过重写我的 customObjectMerger() 以更适合地使用 JSON,计数并让它只考虑来自 HttpServletRequest 的字段。但是,当 spring 提供 几乎正是我正在寻找的东西,减去缺少的 JSON 功能时,即使必须首先使用 customObjectMerger() 也会让人觉得很麻烦。如果有人知道如何让 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。

希望这对某人有所帮助,

编辑:

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

关于java - Spring 部分更新对象数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124858/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com