问题描述
我的情况与这里的问题非常相似:Spring boot how to edit entity。
我有一个“项目”实体,我想为其编辑多个属性(可能是一个,也可能是所有属性)——但关键是。我知道 BeanUtils.copyProperties(sourceItem,targetItem,"id");
非常适合这种情况。从我链接的问题中,我还进一步看到,进行此编辑的一种方法是在控制器中创建一个更新方法,如下所示:
@PutMapping("/{id}")
public ResponseEntity<?> update(@PathVariable("id") Item targetItem,@RequestBody Item sourceItem) {
BeanUtils.copyProperties(sourceItem,"id");
return ResponseEntity.ok(repo.save(targetItem));
}
我面临的问题是我有多个路径变量。因此,要编辑该项目,我宁愿需要 @PutMapping("/{id1}/{id2}/{id3}")
之类的东西,因为该项目本身与其他项目相关联。
因此我尝试做的(基于链接的问题)是:
@PutMapping("/{id1}/{id2}/{id3}")
public ResponseEntity<?> update(@PathVariable("id1/id2/id3") Item targetItem,"id3");
return ResponseEntity.ok(repo.save(targetItem));
}
我认为有问题的部分是 @PathVariable("id1/id2/id3")
,因为 IDE 确实告诉我找不到路径。
我想知道您是否能想出一种优雅的方式来处理多变量问题 - 我觉得使用 BeanUtils.copyProperties()
是一种简洁的编辑方式,我很乐意保持这种方式的完整性。
解决方法
我认为您应该映射到 3 个不同的路径变量:
@PutMapping("/{id1}/{id2}/{id3}")
public ResponseEntity<?> update(@PathVariable("id1") Item targetItem1
@PathVariable("id2") Item targetItem2,@PathVariable("id3") Item targetItem3,@RequestBody Item sourceItem) {
BeanUtils.copyProperties(sourceItem,targetItem1,"id");
return ResponseEntity.ok(repo.save(targetItem1));
}