三大传参注解完整详解

一、@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)
相关推荐
立心者01 天前
D Gaussian splatting : 部署模型网页展示
状态模式
一水3 天前
TTFT优化:一个方案的5次推倒重来
java·ai·状态模式
yz_aiks4 天前
Requestly规则使用技巧:前端联调、接口Mock与网络请求调试实战
前端·网络·状态模式·requestly
星恒随风4 天前
C++ STL 详解:map 与 multimap 的使用、operator[]
开发语言·c++·笔记·学习·状态模式
Dontla5 天前
q搜索 / q过滤解释(q参数、query参数、q=)
状态模式
冰箱上的笑话7 天前
从 CORS 报错到两套方案选型:一份能直接抄的跨域复盘
状态模式·安全性测试·跨域
凤山老林8 天前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然
前端·人工智能·状态模式
码云数智-大飞9 天前
前后端沟通总吵架,一套高效协作规范分享
状态模式
不吃辣4909 天前
vibe coding | 如何做一个skill?
ai·状态模式
早点睡啊Y10 天前
深入学LangChain官方文档(二十二):Frontend 高级形态——Headless Tools、Time Travel 与 Generative UI
ui·langchain·状态模式