三大传参注解完整详解

一、@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)
相关推荐
ttod_qzstudio1 天前
【软考设计模式】状态模式:状态驱动行为自动转换与代码填空精讲
设计模式·状态模式
折哥的程序人生 · 物流技术专研1 天前
Java 23 种设计模式:从踩坑到精通 | 番外:状态 vs 策略 —— if-else 消除的两条路,你走对了吗?
java·spring·状态模式·策略模式·java面试·java设计模式·从踩坑到精通
xiaotie10051 天前
给deerflow2.0增加模型Token 使用数量显示的功能
状态模式
前端H5 天前
微前端 v3 架构升级:从加载隔离到状态协同
前端·架构·状态模式
脑子运行超载7 天前
Java动态生成PDF文件
java·pdf·状态模式·文件上传下载
喵叔哟9 天前
Day 2:先做一个能聊天的页面
状态模式
Arranging157889 天前
2026最新5款AI编程工具平替实测合集
状态模式
aaaa954726659 天前
2026最新5款AI编程工具平替实测合集
状态模式
chase_my_dream11 天前
FAST-LIO src/IMU_Processing.hpp 完整详细讲解
c++·状态模式·slam