@PathVariable与@RequestParam

@PathVariable 和 @RequestParam 这两个非常重要的 Spring MVC 注解。

这两个注解都是用于从 HTTP 请求中获取参数 ,并将其绑定到控制器方法的参数上,但它们获取参数的位置 和方式截然不同。


1. @PathVariable("id") Long id

@PathVariable 用于从 URL 的路径中获取参数。

工作原理

当你在 @PutMapping 注解中定义了一个 URL 模板,如 /region-service/{id},其中 {id} 就是一个路径变量。它是 URL 的一部分。

当一个请求发送到 /region-service/100 时:

  1. Spring MVC 会匹配这个 URL 到 @PutMapping("/region-service/{id}")。
  2. 它会识别出 URL 中的 100 是 {id} 变量的值。
  3. @PathVariable("id") 注解会告诉 Spring MVC:"请把 URL 路径中名为 id 的那部分的值取出来,转换为 Long 类型,并赋给我这个也叫 id 的方法参数。"
代码中的具体场景

在你的代码中:

  • @PutMapping("/{id}") 定义了一个 RESTful 风格的 URL,例如 http://your-domain.com/api/services/123。
  • @PathVariable("id") Long id 会从这个 URL (/123) 中提取出 123 这个值,将其转换为 Long 类型,并传递给 update 方法的 id 参数。这个 id 通常用来唯一标识你要操作的资源(例如,ID 为 123 的服务)。
核心特点
  • 位置:参数位于 URL 路径中。
  • URL 模板 :通过 {变量名} 在 @RequestMapping (或其变体) 中定义。
  • 必需性 :默认情况下是必需的。如果 URL 中缺少这个路径变量,请求会失败(返回 404 Not Found)。如果想让它非必需,可以设置 @PathVariable(required = false)。
  • 常见场景:用于 RESTful API 中,标识资源的唯一ID,如查询、更新、删除某个特定资源。

2. @RequestParam("price") BigDecimal price

@RequestParam 用于从 HTTP 请求的查询参数(Query String)中获取参数。

工作原理

查询参数是 URL 中 ? 后面的部分,例如 http://your-domain.com/api/services/123?price=99.99。这里的 price=99.99 就是一个查询参数。

当一个请求发送到上述 URL 时:

  1. @RequestParam("price") 注解会告诉 Spring MVC:"请从请求的查询参数中找到名为 price 的参数。"
  2. 它会获取其值 "99.99"。
  3. 然后 Spring MVC 会尝试将这个字符串值转换为 BigDecimal 类型,并赋给方法的 price 参数。
代码中的具体场景

在你的代码中:

  • @RequestParam("price") BigDecimal price 会从请求的 URL 查询参数中获取 price 的值。
  • 对于一个完整的请求 URL http://.../123?price=158.00,price 参数的值 "158.00" 会被提取出来,并转换为 BigDecimal 类型,传递给 update 方法。这个 price 就是你想要更新的新价格。
核心特点
  • 位置 :参数位于 URL 的查询字符串中(? 之后)。
  • 键值对 :格式为 ?key1=value1&key2=value2。
  • 必需性 :默认情况下是必需的。如果请求中缺少这个参数,Spring MVC 会抛出 MissingServletRequestParameterException 异常(通常导致 400 Bad Request 错误)。你可以通过设置 @RequestParam(required = false) 来使其成为可选参数。
  • 默认值 :可以通过 @RequestParam(defaultValue = "0") 为参数提供一个默认值。
  • 常见场景:用于接收用户通过表单提交、或在 URL 中附加的过滤条件、分页信息、排序方式等非资源标识类的参数。

总结与对比

特性 @PathVariable @RequestParam
参数来源 URL 的路径中 URL 的查询字符串 中 (? 之后)
URL 示例 /services/**123** /services?**price=99.99**
用途 通常用于标识一个具体的资源 (如 ID) 通常用于过滤、排序、分页或传递操作的具体数据
必需性 默认必需 默认必需
获取方式 request.getPathInfo() (概念上) request.getParameter("price")

在你的代码中的协同作用

你的 update 方法完美地展示了它们的协同工作:

  • @PathVariable("id") 定位到要修改的具体服务(例如,ID 为 123 的服务)。
  • @RequestParam("price") 传递要修改的新价格(例如,99.99)。

这个设计非常符合 RESTful API 的风格,清晰地分离了"操作的资源"和"操作的内容"。

相关推荐
wtblszn6 分钟前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Nuanyt8 分钟前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
zhongben_keji14 分钟前
本地生活 APP 开发:城市 × 品类 × 履约形态的三维网格与三套账
java·大数据·生活
code2cat2 小时前
Java工具篇之Maven:从pom.xml到测试通过的JAR
xml·java·maven
wuminyu8 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
txxzjmzlh9 小时前
SpringBoot 配置⽂件
java·spring boot·spring
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3279 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
独泪了无痕9 小时前
Hutool之LocalDateTimeUtil:让时间间隔操作如虎添翼
java
三无少女指南11 小时前
从这里开始:Java 后端与 AI 工程的三条阅读路线
java·学习路线·ai工程