参数注解使用场景完整指南
1. @requestbody 使用场景
核心特征:
- http方法:主要用于 post、put、patch
- 数据来源:http请求体 (request body)
- content-type:通常是
application/json
适用场景:
// 场景1:用户登录 - 敏感数据
@postmapping("/login")
public result<employeeloginvo> login(@requestbody employeelogindto employeelogindto) {
// 原因:用户名密码敏感,需要在请求体中加密传输
}
// 场景2:新增员工 - 复杂对象
@postmapping
public result save(@requestbody employeedto employeedto) {
// 原因:多个字段的复杂对象,json格式更清晰
}
// 场景3:修改员工信息 - 更新操作
@putmapping
public result update(@requestbody employeedto employeedto) {
// 原因:修改操作通常用put,需要传递完整对象
}
// 场景4:批量操作
@postmapping("/batch")
public result batchsave(@requestbody list<employeedto> employees) {
// 原因:批量数据,数组/列表格式
}
2. @pathvariable 使用场景
核心特征:
- 数据来源:url路径中的变量部分
- 用途:资源标识符,符合restful设计
- http方法:get、put、delete等
适用场景:
// 场景1:根据id查询 - 资源标识
@getmapping("/{id}")
public result<employee> getbyid(@pathvariable long id) {
// url: /admin/employee/123
// 原因:id是资源的唯一标识符
}
// 场景2:根据id删除 - 资源操作
@deletemapping("/{id}")
public result delete(@pathvariable long id) {
// url: /admin/employee/123
// 原因:明确指定要删除的资源
}
// 场景3:状态切换 - 动作+资源
@postmapping("/status/{status}")
public result startorstop(@pathvariable integer status, long id) {
// url: /admin/employee/status/1?id=123
// 原因:status是操作类型,属于url路径的一部分
}
// 场景4:多级资源路径
@getmapping("/department/{deptid}/employees/{empid}")
public result getemployeeindept(@pathvariable long deptid, @pathvariable long empid) {
// url: /admin/department/10/employees/123
// 原因:表示部门下的特定员工资源
}
3. 无注解使用场景
核心特征:
- 数据来源:url查询参数 (query parameters)
- 用途:查询条件、过滤参数、分页参数
- http方法:主要是get
适用场景:
// 场景1:分页查询 - 查询条件
@getmapping("/page")
public result<pageresult> page(employeepagequerydto employeepagequerydto) {
// url: /admin/employee/page?name=张&page=1&pagesize=10
// 原因:简单查询条件,支持缓存和书签
}
// 场景2:简单参数查询
@getmapping("/search")
public result<list<employee>> search(string keyword, integer status) {
// url: /admin/employee/search?keyword=张三&status=1
// 原因:简单的过滤条件
}
// 场景3:可选参数查询
@getmapping("/list")
public result<list<employee>> list(string department, integer level) {
// url: /admin/employee/list?department=it&level=2
// 原因:可选的查询条件,可以为空
}
详细对比表格
| 注解类型 | http方法 | 数据位置 | 使用场景 | url示例 | 优缺点 |
|---|---|---|---|---|---|
| @requestbody | post/put/patch | 请求体 | 复杂对象、敏感数据、批量操作 | post /employee + json | ✅复杂数据 ❌不支持缓存 |
| @pathvariable | get/put/delete | url路径 | 资源标识符、层级资源 | get /employee/123 | ✅restful ✅语义清晰 |
| 无注解 | get | url参数 | 查询条件、分页、过滤 | get /employee?name=张&page=1 | ✅支持缓存 ✅书签友好 |
实际项目中的应用示例
员工管理模块完整示例
@restcontroller
@requestmapping("/admin/employee")
public class employeecontroller {
// 1. 登录 - @requestbody (敏感数据)
@postmapping("/login")
public result<employeeloginvo> login(@requestbody employeelogindto dto) {
// post /admin/employee/login + json
}
// 2. 新增 - @requestbody (复杂对象)
@postmapping
public result save(@requestbody employeedto dto) {
// post /admin/employee + json
}
// 3. 分页查询 - 无注解 (查询条件)
@getmapping("/page")
public result<pageresult> page(employeepagequerydto dto) {
// get /admin/employee/page?name=张&page=1&pagesize=10
}
// 4. 根据id查询 - @pathvariable (资源标识)
@getmapping("/{id}")
public result<employee> getbyid(@pathvariable long id) {
// get /admin/employee/123
}
// 5. 修改 - @requestbody (更新对象)
@putmapping
public result update(@requestbody employeedto dto) {
// put /admin/employee + json
}
// 6. 启用禁用 - @pathvariable + 无注解 (状态+id)
@postmapping("/status/{status}")
public result startorstop(@pathvariable integer status, long id) {
// post /admin/employee/status/1?id=123
}
// 7. 删除 - @pathvariable (资源标识)
@deletemapping("/{id}")
public result delete(@pathvariable long id) {
// delete /admin/employee/123
}
}
决策流程图
是否传输复杂对象或敏感数据?
├─ 是 → 使用 @requestbody (post/put + json)
└─ 否 → 是否资源标识符?
├─ 是 → 使用 @pathvariable (/{id})
└─ 否 → 无注解 (url参数,get请求)
记忆口诀
- @requestbody = “复杂敏感批量” (复杂对象、敏感数据、批量操作)
- @pathvariable = “资源标识符” (id、路径参数、restful)
- 无注解 = “查询过滤分页” (查询条件、过滤器、分页参数)
特殊场景说明
混合使用场景
// 组合1:路径参数 + 查询参数
@getmapping("/department/{deptid}/employees")
public result getemployeesbydept(@pathvariable long deptid,
string keyword,
integer page) {
// get /admin/department/10/employees?keyword=张&page=1
}
// 组合2:路径参数 + 请求体
@putmapping("/{id}")
public result update(@pathvariable long id,
@requestbody employeedto dto) {
// put /admin/employee/123 + json
// id确定资源,dto包含更新数据
}
总结
这三种注解的选择遵循以下原则:
- @requestbody - 数据复杂度高、安全性要求高、修改操作
- @pathvariable - 资源定位、restful风格、层级关系
- 无注解 - 查询场景、性能优化、用户体验
选择正确的注解不仅能让代码更规范,还能提升api的性能和用户体验!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论