Spring Boot 请求参数绑定注解

1. @RequestBody- 处理复杂结构化数据

使用场景:接收 JSON/XML 格式的请求体

复制代码
@PostMapping("/user")
public User createUser(@RequestBody @Valid User user) {
    // 直接获取前端传来的完整用户对象
    return userService.save(user);
}

特点

  • 通常与 POST、PUT 请求一起使用

  • 需要设置 Content-Type: application/json

  • 支持嵌套对象、列表等复杂数据结构

2. @RequestParam- 获取简单查询参数

使用场景:URL 查询参数和表单提交

复制代码
@GetMapping("/search")
public List<User> searchUsers(
    @RequestParam("keyword") String keyword,
    @RequestParam(value = "page", defaultValue = "1") int page,
    @RequestParam(value = "size", required = false) Integer size
) {
    // 处理分页搜索
    return userService.search(keyword, page, size);
}

特性

  • 参数可通过 required=false设置为可选

  • 支持默认值设置

  • 适合 GET 请求和简单表单提交

3. @PathVariable- 获取 RESTful 路径参数

使用场景:RESTful 风格 API

复制代码
@GetMapping("/users/{userId}/orders/{orderId}")
public Order getOrder(
    @PathVariable Long userId,
    @PathVariable("orderId") Long orderNo
) {
    // 获取用户ID为 userId,订单ID为 orderNo 的订单
    return orderService.findByUserAndOrder(userId, orderNo);
}

注意:路径变量是 RESTful API 设计的核心,使 URL 更加语义化。

4. @RequestHeader- 获取 HTTP 头信息

使用场景:获取认证信息、客户端信息等

复制代码
@GetMapping("/profile")
public Profile getUserProfile(
    @RequestHeader("Authorization") String token,
    @RequestHeader(value = "User-Agent", required = false) String userAgent
) {
    // 验证 token 并记录客户端信息
    return userService.getProfile(token, userAgent);
}

使用场景:会话管理、用户追踪

复制代码
@GetMapping("/cart")
public Cart getShoppingCart(
    @CookieValue("SESSION_ID") String sessionId,
    @CookieValue(value = "USER_TOKEN", defaultValue = "") String userToken
) {
    return cartService.getCart(sessionId, userToken);
}

6. @ModelAttribute- 传统表单绑定

使用场景:服务端渲染页面

复制代码
@PostMapping("/register")
public String registerUser(@ModelAttribute UserForm form, Model model) {
    User user = userService.register(form);
    model.addAttribute("user", user);
    return "register-success"; // 返回视图名称
}

与现代前端开发的区别@ModelAttribute主要用于传统 Web 应用,而 @RequestBody更适合前后端分离架构。

7. @Valid/ @Validated- 参数校验

使用场景:确保数据合法性

复制代码
public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度3-20字符")
    private String username;
    
    @Email(message = "邮箱格式不正确")
    private String email;
    
    @Min(value = 18, message = "年龄必须大于18岁")
    @Max(value = 100, message = "年龄必须小于100岁")
    private Integer age;
}

@PostMapping("/create")
public Result createUser(@RequestBody @Valid UserDTO user) {
    // 校验通过才会执行到这里
    return Result.success(userService.save(user));
}

示例

复制代码
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
    
    @PutMapping("/{userId}")
    public ResponseEntity<User> updateUser(
        @PathVariable Long userId,                    // 从路径获取用户ID
        @RequestHeader("Authorization") String token, // 获取认证token
        @RequestBody @Valid UpdateUserRequest request // 获取更新数据并校验
    ) {
        // 1. 验证token
        authService.validateToken(token);
        
        // 2. 更新用户信息
        User updatedUser = userService.update(userId, request);
        
        return ResponseEntity.ok(updatedUser);
    }
}
数据来源 使用注解 适用请求类型
JSON/XML 请求体 @RequestBody POST, PUT, PATCH
URL 查询参数 @RequestParam GET, 也可用于 POST
URL 路径变量 @PathVariable 所有类型
HTTP 请求头 @RequestHeader 所有类型
Cookie 值 @CookieValue 所有类型
传统表单 @ModelAttribute POST(表单提交)

❌ 常见错误

  1. 混淆 @RequestParam@PathVariable

    复制代码
    // 错误:期望从查询参数获取,但实际上应该用路径变量
    @GetMapping("/users/{id}")  // URL: /users/123
    public User getUser(@RequestParam Long id) { ... }  // id 应该是 null
    
    // 正确
    public User getUser(@PathVariable Long id) { ... }
  2. 忘记添加 @Valid

    复制代码
    // 错误:校验注解不会生效
    public User create(@RequestBody UserDTO user) { ... }
    
    // 正确
    public User create(@RequestBody @Valid UserDTO user) { ... }

总结

  1. @RequestBody ​ 用于复杂数据,**@RequestParam**​ 用于简单参数

  2. **@PathVariable**​ 是 RESTful API 的必备

  3. **@Valid**​ 是保证数据质量的守护者

相关推荐
二哈赛车手7 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
栗子~~8 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8298 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
candyTong9 小时前
Claude Code 的 Edit 工具是怎么工作的
javascript·后端·架构
未若君雅裁9 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
GetcharZp10 小时前
GitHub 2.4 万 Star!D2 正在重新定义程序员画图方式
后端
阿维的博客日记10 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring
雨辰AI10 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
辰海Coding11 小时前
MiniSpring框架学习-完成的 IoC 容器
java·spring boot·学习·架构