@PathVariable注解

PathVariable 是 Spring 框架中的一个注解,用于从 URL 路径里获取变量值。它常常在 RESTful 服务里发挥作用,能够让我们创建带有参数的动态 URL。

下面通过示例来详细说明其用法:

基础用法

当我们在 URL 路径中定义了变量,就可以借助 PathVariable 注解把这些变量值绑定到控制器方法的参数上。

基础用法 复制代码
import org.springframework.web.bind.annotation.GetMapping; 
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController; 
@RestController 
public class UserController {
      // 这里定义了一个路径变量 userId,它会匹配 URL 中 /users/ 后面的部分 
      @GetMapping("/users/{userId}")
      public String getUser(@PathVariable String userId) {
      // 方法接收到路径变量后,就可以根据这个 ID 去获取对应的用户信息 
      return "获取 ID 为 " + userId + " 的用户信息"; 
   }
}

如果我们发送一个请求到 http://localhost:8080/users/123,那么 userId 这个路径变量就会被赋值为 "123",接着在方法里就能够使用这个值来获取相关用户信息。

多个路径变量的情况

在同一个 URL 路径中,我们可以定义多个路径变量。

多个路径变量的情况 复制代码
@GetMapping("/users/{userId}/orders/{orderId}") 
public String getOrder(@PathVariable String userId, @PathVariable String orderId) {
    return "获取用户 " + userId + " 的订单 " + orderId; 
}

对于请求 http://localhost:8080/users/123/orders/456userId 会被赋值为 "123"orderId 会被赋值为 "456"

自定义路径变量名称

要是方法参数名和路径变量名不一样,我们可以通过 @PathVariable 的 value 属性来指定路径变量名。

自定义路径变量名称 复制代码
@GetMapping("/products/{productId}") 
public String getProduct(@PathVariable("productId") String id) { 
    return "获取产品 ID 为 " + id + " 的信息"; 
}

类型转换功能

PathVariable 能够自动把路径变量转换为方法参数所需的类型。

类型转换功能 复制代码
@GetMapping("/accounts/{accountId}") 
public String getAccount(@PathVariable Long accountId) { 
    // 这里路径变量会自动转换为 Long 类型 
    return "获取账户 ID 为 " + accountId + " 的信息"; 
}

正则表达式约束

我们可以使用正则表达式来限制路径变量的取值范围。

正则表达式约束 复制代码
@GetMapping("/books/{isbn:\\d{13}}")
public String getBook(@PathVariable String isbn) {
    return "获取 ISBN 为 " + isbn + " 的书籍";
}

上面这个例子中,isbn 路径变量必须是 13 位的数字。 关于isbn

注意事项

  • 路径变量是 URL 的一部分,所以在客户端发送请求时必须提供。
  • 要保证路径变量的顺序和控制器方法中参数的顺序一致。
  • 路径变量的名称必须和 URL 模板中定义的名称相同,除非我们使用 @PathVariable 的 value 属性进行了重命名。 PathVariable 是 Spring 框架中的一个注解,用于从 URL 路径里获取变量值。它常常在 RESTful 服务里发挥作用,能够让我们创建带有参数的动态 URL。

下面通过示例来详细说明其用法:

基础用法

当我们在 URL 路径中定义了变量,就可以借助 PathVariable 注解把这些变量值绑定到控制器方法的参数上。

java 复制代码
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    // 这里定义了一个路径变量 userId,它会匹配 URL 中 /users/ 后面的部分
    @GetMapping("/users/{userId}")
    public String getUser(@PathVariable String userId) {
        // 方法接收到路径变量后,就可以根据这个 ID 去获取对应的用户信息
        return "获取 ID 为 " + userId + " 的用户信息";
    }
}

如果我们发送一个请求到 http://localhost:8080/users/123,那么 userId 这个路径变量就会被赋值为 "123",接着在方法里就能够使用这个值来获取相关用户信息。

多个路径变量的情况

在同一个 URL 路径中,我们可以定义多个路径变量。

java 复制代码
@GetMapping("/users/{userId}/orders/{orderId}")
public String getOrder(@PathVariable String userId, @PathVariable String orderId) {
    return "获取用户 " + userId + " 的订单 " + orderId;
}

对于请求 http://localhost:8080/users/123/orders/456userId 会被赋值为 "123"orderId 会被赋值为 "456"

自定义路径变量名称

要是方法参数名和路径变量名不一样,我们可以通过 @PathVariable 的 value 属性来指定路径变量名。

java 复制代码
@GetMapping("/products/{productId}")
public String getProduct(@PathVariable("productId") String id) {
    return "获取产品 ID 为 " + id + " 的信息";
}

类型转换功能

PathVariable 能够自动把路径变量转换为方法参数所需的类型。

java 复制代码
@GetMapping("/accounts/{accountId}")
public String getAccount(@PathVariable Long accountId) {
    // 这里路径变量会自动转换为 Long 类型
    return "获取账户 ID 为 " + accountId + " 的信息";
}

正则表达式约束

我们可以使用正则表达式来限制路径变量的取值范围。

java 复制代码
@GetMapping("/books/{isbn:\\d{13}}")
public String getBook(@PathVariable String isbn) {
    return "获取 ISBN 为 " + isbn + " 的书籍";
}

上面这个例子中,isbn 路径变量必须是 13 位的数字。 关于isbn

注意事项

  • 路径变量是 URL 的一部分,所以在客户端发送请求时必须提供。
  • 要保证路径变量的顺序和控制器方法中参数的顺序一致。
  • 路径变量的名称必须和 URL 模板中定义的名称相同,除非我们使用 @PathVariable 的 value 属性进行了重命名。

借助 PathVariable,我们能够创建出简洁且有语义的 URL,这对于构建 RESTful API 而言非常实用。

相关推荐
2601_961593421 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
犀利豆3 小时前
AI in Harness(三)
人工智能·后端
IT_陈寒4 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
子兮曰5 小时前
Bun 重写为 Rust:11天、64个Claude、16.5万美元,一次改变行业认知的激进实验
前端·后端·bun
子兮曰5 小时前
Node.js v26.5.0 深度解读:import Text、流式 ReadableStreamTee、以及隐藏的安全加固浪潮
前端·后端·node.js
子兮曰5 小时前
TypeScript 7.0 RC 深度解读:Go 重写完成,10 倍提速,编译器的「奇点时刻」
前端·后端·typescript
kosan5 小时前
.NET/C# 实战:我如何把登录验证码从“裸奔”改到“铜墙铁壁”
后端
王中阳Go5 小时前
AI编程实践:规则 + 技能 + 子代理 + 钩子,拆解Trae AI 开发规范的完整落地范式
后端·agent·ai编程
码事漫谈6 小时前
放下代码洁癖,享受挖坑人生
后端
_张有志_6 小时前
手撕 STL:一棵红黑树,凭什么同时撑起 set 和 map?
后端