Spring Boot PUT请求使用路径变量ID无需请求体传ID的修改方法
问题解决方法
问题根源:当前代码中Service层的更新SQL语句,WHERE条件使用的是从请求体反序列化得到的Person对象的id属性,并没有用到URL路径传递的id参数,所以才要求请求体必须携带ID才能正常执行更新。
以下两种方案都可以实现不需要请求体传ID的需求:
方案1:修改Service层SQL参数(改动最小)
直接将Service方法中JDBC的第二个参数,从person.getId()替换为方法入参的路径ID即可,无需修改其他层代码:
public int updatePerson(UUID id, Person person) { String sql = "UPDATE person SET name = ? WHERE id = ?"; // 第二个参数改用路径传入的id,不再从请求体的Person对象取值 return jdbcTemplate.update(sql, person.getName(), id); }
方案2:Controller层注入ID到Person对象(扩展性更好)
如果后续业务逻辑需要用到Person对象的id属性,建议优先用这个方案:
- 首先在Person实体类补全
id的setter方法
public class Person { private String name; private UUID id; public Person(UUID id, String name) { this.id = id; this.name = name; } // 新增id的setter方法 public void setId(UUID id) { this.id = id; } // ...原有getters }
- 修改Controller层代码,将路径ID注入到请求体的Person对象中
@PutMapping("/{id}") public int updatePerson(@PathVariable UUID id, @RequestBody Person person) { person.setId(id); return personService.updatePerson(id, person); }
这个方案下Service层代码无需修改,后续所有调用person.getId()的逻辑都能正常获取到URL路径传递的ID。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

