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**​ 是保证数据质量的守护者

相关推荐
云姜.1 小时前
线程和进程的关系
java·linux·jvm
是码龙不是码农1 小时前
支付防重复下单|5 种幂等性设计方案(从初级到架构级)
java·架构·幂等性
曹牧1 小时前
Spring Boot:如何在Java Controller中处理POST请求?
java·开发语言
heartbeat..1 小时前
JVM 性能调优流程实战:从开发规范到生产应急排查
java·运维·jvm·性能优化·设计规范
WeiXiao_Hyy1 小时前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
苏渡苇1 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
团子的二进制世界1 小时前
G1垃圾收集器是如何工作的?
java·jvm·算法
long3161 小时前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
独断万古他化2 小时前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密
rannn_1112 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习