三大传参注解完整详解

一、@RequestParam(你项目绝大多数接口在用,form 表单 / URL 查询参数)

1. 接收数据来源

两种数据载体:

  1. GET 请求:URL ? 后面拼接的键值对 例:/actionmall/product/findproducts.do?pageNum=1&pageSize=10
  2. POST 表单提交:Content-Type: application/x-www-form-urlencoded(你 JMeter 所有接口都是这个类型) 表单体:account=zhangsan&password=123456

2. 核心属性

java

复制代码
// 完整写法
@RequestParam(
    value = "前端参数名",
    required = true,       // 是否必传,不传直接400报错
    defaultValue = "1"      // 参数缺失时默认值,自动使required=false
)
  • required=true(默认):压测时 JMeter 漏传该参数,直接返回 400,计入错误率(你 20%/50% 报错核心诱因)
  • defaultValue:兜底,分页、ID 类参数推荐配置,减少压测失败

3. 多值 / 数组接收(购物车批量结算场景)

前端传:cartIds=1&cartIds=2&cartIds=3

java

复制代码
// 直接接收集合
public Result createOrder(@RequestParam List<Long> cartIds)

4. 适用场景

你的全量前台、后台、支付回调接口全部适配; 不能接收 JSON 字符串,如果前端传 JSON,用这个注解会接收不到任何数据。

5. JMeter 匹配示例

plaintext

复制代码
POST /actionmall/user/do_shturl.c
Content-Type: application/x-www-form-urlencoded
account=zhangsan&password=123456&captchaKey=test

后端接收:

java

复制代码
@RequestMapping("/user/do_shturl.c")
public Result login(
    @RequestParam String account,
    @RequestParam String password,
    @RequestParam String captchaKey
)

二、@RequestBody(接收 JSON 请求体,表单接口完全不兼容)

1. 接收数据来源

请求请求体完整 JSON 字符串 ,要求请求头:Content-Type: application/json 请求体示例:

json

复制代码
{
  "productId": 1,
  "quantity": 2
}

2. 核心特性

  1. 只能有一个 @RequestBody 注解,整个请求体只能绑定一个实体类;
  2. 自动 JSON 序列化 / 反序列化,底层依赖 Jackson;
  3. 完全不识别 form 表单、URL 问号参数,混用直接参数为空、400 报错。

3. 代码示例

java

复制代码
// 实体类
public class CartDTO {
    private Long productId;
    private Integer quantity;
}

// Controller
@RequestMapping("/cart/add")
public Result addCart(@RequestBody CartDTO cartDTO) {
    // 自动把JSON映射到CartDTO对象
}

4. 和你现有压测冲突点

你当前 JMeter 全部是application/x-www-form-urlencoded表单,如果后端接口写了@RequestBody,所有请求参数全部接收失败,错误率 100%。

改造方式:JMeter 请求头改为application/json,请求体切换为 Raw JSON。


三、@PathVariable(提取 URL 路径中的动态变量,无请求参数)

1. 接收数据来源

URL 路径本身 截取变量,不是问号、不是表单、不是 JSON。 URL 示例:/actionmall/product/detail/{productId} 这里 {productId} 就是路径变量。

2. 代码示例

java

复制代码
@RequestMapping("/product/detail/{productId}")
public Result getDetail(@PathVariable Long productId) {
    // productId 从URL路径中提取
}

访问地址:/actionmall/product/detail/1 → productId=1

3. 多路径变量

java

复制代码
@RequestMapping("/order/{orderNo}/log/{logId}")
public Result log(@PathVariable String orderNo, @PathVariable Long logId)

4. 关键限制

  1. 仅解析路径占位符,拿不到表单、URL 后的?参数;
  2. 没有requireddefaultValue属性,路径缺少占位符直接 404 页面不存在;
  3. 适合 RESTful 风格接口,你当前电商项目几乎没有这类接口。

四、三者核心对比表(一目了然)

表格

注解 数据源 对应 Content-Type 典型传参格式 你的项目适配度
@RequestParam URL? 参数 /form 表单 application/x-www-form-urlencoded key=val&key2=val2 极高(全部现有接口)
@RequestBody 请求体 JSON application/json {"key":val} 低(无现有接口)
@PathVariable URL 路径占位符 无要求,不依赖请求体 /xxx/{id} 极低

五、结合你压测报错的避坑重点

  1. 不要混用 @RequestBody 和表单 后端接口写了@RequestBody,但 JMeter 用表单传参 → 参数全部为空,大量 400 错误;

  2. @RequestParam 的 required=true 是报错重灾区 分页、地址 ID、验证码等参数如果漏传,直接失败,建议分页加defaultValue="1"兜底;

  3. @PathVariable 不存在默认值 如果路径变量缺失,不会进入接口方法,直接 404,无法通过注解兜底;

  4. 同一接口可以同时使用 @RequestParam + @PathVariable 例:/product/{id}?page=1

    java

    复制代码
    public Result test(@PathVariable Long id, @RequestParam Integer page)
相关推荐
听风吹等浪起30 分钟前
004:多个PDF合并成一个PDF【网页版】
pdf·状态模式
千码君201639 分钟前
应用市场V1.0 普通用户 注销账户的业务逻辑
状态模式
咏方舟【长江支流】2 小时前
【前端2】单据编辑 -订单单据主子表,万能模板行,自定义添加行
前端·前端框架·状态模式·咏方舟-长江支流
涤生大数据11 小时前
一次“没有运行日志”的DolphinScheduler任务失败排查
大数据·数据库·人工智能·状态模式
FungLeo1 天前
React 管理后台实战 · 列表里突然出现一堆空白行?PIPL 擦除后前端怎么处理才不露馅
前端·react.js·状态模式·pipl
国科安芯1 天前
ASL3159S:把精密信号的“破音“挡在切换之外的 0.9Ω 开关
服务器·网络·数据库·架构·状态模式·抗辐射加固
不灭的程序员阿澄2 天前
Nginx 容器化部署实战:SPA 路由、Cookie 透传与 WebSocket 全配置详解
websocket·nginx·状态模式
国科安芯4 天前
ASL622S:把“信号失真“挡在门外的航天级运放
网络·单片机·嵌入式硬件·架构·状态模式·低轨卫星星座
leoZ2318 天前
Vue3 还原一个企业级后台-08-API注册管理
目标检测·机器学习·分类·状态模式·迁移学习·集成学习·figma