【发布时间】:2019-10-29 23:16:42
【问题描述】:
所以我知道在 REST 中,通常当我执行 PUT 请求时,我应该在 URL 中指定我想要更新的资源,例如:.../collections/{collectionId}
在 Spring Boot 中为我的 Role 资源实现该功能如下所示:
@RepositoryRestController
@RequestMapping("/roles")
public class RoleController {
private RoleRepository roleRepository;
@Autowired
public RoleController(RoleRepository roleRepository) {
this.roleRepository = roleRepository;
}
@PutMapping("/{roleId}")
public @ResponseBody ResponseEntity<Role> putRole(@PathVariable long roleId, @RequestBody Role newRole) {
Optional<Role> roleOptional = this.roleRepository.findById(roleId);
if(roleOptional.isPresent()) {
Role roleToBeSaved = roleOptional.get();
roleToBeSaved.name = newRole.name;
roleToBeSaved.description = newRole.description;
// set more attribute
this.roleRepository.save(roleToBeSaved);
return ResponseEntity.ok(roleToBeSaved);
}
throw new RoleNotFoundException('could not find role with id + ' + roleId);
}
}
但这不是比需要的更多工作,因为 RequestBody 中的 newRole 已经包含 id,所以我可以这样做:
@PutMapping("/{roleId}")
public @ResponseBody ResponseEntity<Role> putRole(@PathVariable long roleId, @RequestBody Role newRole) {
this.roleRepository.save(newRole);
return ResponseEntity.ok(newRole);
}
这会导致未使用的 PathVariable,但我不需要它,因为 newRole 已经包含 ID。那么执行这样的 PUT-Request 的最佳方式是什么?
编辑:我显然可以将 URL 更改为 .../roles/role 之类的东西,而无需 PathVariable,只需在 RequestBody 中发送 newRole。但这不是 PUT-Request URL 通常应该的样子,对吧?
【问题讨论】:
-
roleId是角色不可分割的一部分吗?或者只是因为你把它放在数据库/地图中并用它作为键而使用它? -
您的第一种方法可以正确处理找到不存在角色的情况,而后者则不会,并允许通过更新方法添加新角色。不确定这是否是你真正想要的。此外,该代码实际上应该在服务类中,而不是在控制器中,并且对于映射,您可能需要像
MapStruct这样的框架。你能做第二个吗,是的,你可能不会。