当前位置: 首页 > news >正文

Spring 控制器参数注解

文章目录

  • 1. 核心参数注解列表
  • 2. 注解详解与对比
    • (1)`@RequestParam`
    • (2)`@PathVariable`
    • (3)`@RequestBody`
    • (4)`@ModelAttribute`
    • (5)`@RequestHeader`
    • (6)`@CookieValue`
    • (7)`@SessionAttribute`
    • (8)`@RequestPart`
  • 3. 注解对比与选择
  • 4. 常见问题
    • (1)`@RequestParam` vs `@ModelAttribute`
    • (2)`@RequestBody` vs `@ModelAttribute`
    • (3)何时用 `@PathVariable`?
  • 5. 完整示例

在 Java Spring(特别是 Spring MVC 和 Spring Boot)中,控制器方法的参数注解用于绑定请求数据(如 URL 参数、表单数据、JSON 等)到方法参数。以下是常见的参数注解及其区别的详细解析。

1. 核心参数注解列表

注解作用域主要用途支持的请求类型
@RequestParam方法参数获取 URL 查询参数或表单数据GET/POST (表单/查询参数)
@PathVariable方法参数从 URL 路径中提取变量所有 HTTP 方法
@RequestBody方法参数解析 HTTP 请求体(如 JSON/XML)POST/PUT/PATCH (Body)
@ModelAttribute方法参数/方法声明绑定请求参数到对象(表单/查询参数)GET/POST (表单/查询参数)
@RequestHeader方法参数获取 HTTP 请求头字段所有 HTTP 方法
@CookieValue方法参数获取 Cookie 值所有 HTTP 方法
@SessionAttribute方法参数从会话(Session)中读取属性所有 HTTP 方法
@RequestPart极速方法参数处理文件上传(multipart/form-data)POST (文件上传)

2. 注解详解与对比

(1)@RequestParam

  • 用途:获取 URL 查询参数表单数据application/x-www-form-urlencoded)。
  • 示例
    
    @GetMapping("/user")public String getUser(@RequestParam("id") Long userId) {return "User ID: " + userId;}
    
  • 请求 /user?id=123 时,userId 值为 123
  • 关键特性
  • 默认必传(可通过 required = false 设为可选)。
  • 支持默认值(defaultValue = "0")。
  • 若参数名与方法参数名一致,可省略注解值(@RequestParam Long id)。

(2)@PathVariable

  • 用途:从 URL 路径模板 中提取变量。
  • 示例
    
    @GetMapping("/user/{id}")public String getUser(@PathVariable("id") Long userId) {return "User ID: " + userId;}
    
  • 请求 /user/123 时,userId 值为 123
  • 关键特性
  • 必须与 @GetMapping 等映射注解中的路径变量名匹配。
  • 支持可选路径变量(需结合 required = false)。

(3)@RequestBody

  • 用途:解析 HTTP 请求体(如 JSON、XML)为 Java 对象。
  • 示例
    
    @PostMapping("/user")public User createUser(@RequestBody User user) {return userService.save(user);}
    
  • 请求体 {"name": "Alice", "age": 25} 会被转换为 极速User 对象。
  • 关键特性
  • 通常与 @RestController@ResponseBody 配合使用。
  • 依赖 HttpMessageConverter(如 MappingJackson2HttpMessageConverter 处理 JSON)。

(4)@ModelAttribute

  • 用途
  • 方法参数:自动绑定表单/查询参数到对象(非 JSON)。
  • 方法声明:在控制器方法调用前初始化模型属性。
  • 示例
    
    @PostMapping("/user")public String saveUser(@ModelAttribute User user) {// user 的属性自动从表单或查询参数填充return "success";}
    
  • 请求 /user?name=Alice&age=25 时,User 对象的 nameage 被自动赋值。
  • 关键特性
  • 支持级联绑定(如 user.address.city)。
  • 与 Thymeleaf 等模板引擎配合时,可自动填充模型数据。

(5)@RequestHeader

  • 用途:获取 HTTP 请求头 的值。
  • 示例
    
    @GetMapping("/info")public String getInfo(@RequestHeader("User-Agent") String userAgent) {return "User Agent: " + userAgent;}
    
  • 关键特性
  • 支持默认极速值(defaultValue)。
  • 可绑定到 Map 获取所有请求头:
    
    public void handle(@RequestHeader Map<String, String> headers)
    

(6)@CookieValue

  • 用途:获取 Cookie 的值。
  • 示例
    
    @GetMapping("/cookie")public String readCookie(@CookieValue("JSESSIONID") String sessionId) {return "Session ID: " + sessionId;}
    

(7)@SessionAttribute

  • 用途:从 HTTP 会话(Session) 中读取属性。
  • 示例
    
    @GetMapping("/profile")public String profile(@SessionAttribute("user") User user极速) {return "Profile: " + user.getName();}
    
  • 需确保会话中已存在 user 属性(如通过 @SessionAttributes 声明)。

(8)@RequestPart

  • 用途:处理 文件上传multipart/form-data)。
  • 示例
    
    @PostMapping("/upload")public String uploadFile(@RequestPart("file") MultipartFile file) {String fileName = file.getOriginalFilename();return "Uploaded: " + fileName;}
    
  • 关键特性
  • 适用于 <input type="file"> 表单提交。
  • 可同时绑定其他非文件参数:
    
    public String upload(@RequestPart("file") MultipartFile file,@RequestParam("desc") String description)
    

3. 注解对比与选择

场景推荐注解理由
获取 URL 查询参数@RequestParam专为查询参数设计,支持可选参数和默认值。
从 URL 路径中提取变量@PathVariable直接绑定 RESTful 风格的路径变量。
解析 JSON/XML 请求体@RequestBody唯一支持复杂请求体(如 POJO)的注解。
绑定表单数据到对象@ModelAttribute自动填充对象属性,适合传统表单提交。
获取请求头@RequestHeader精确访问特定请求头字段。
处理文件上传@RequestPart专为 multipart/form-data 设计,支持 MultipartFile

4. 常见问题

(1)@RequestParam vs @ModelAttribute

  • 相同点:均可处理表单数据。
  • 区别
  • @RequestParam:逐个绑定简单类型(如 String, int)。
  • @ModelAttribute:自动绑定到对象的字段(如 Username 属性)。

(2)@RequestBody vs @ModelAttribute

  • @RequestBody
  • 处理 结构化数据(JSON/XML)。
  • 通常用于 API 开发。
  • @ModelAttribute
  • 处理 表单数据application/x-www-form-urlencoded)。
  • 适合传统 Web 应用(如 Thymeleaf + 表单提交)。

(3)何时用 @PathVariable

  • RESTful API 中标识资源时:
    
    @DeleteMapping("/user/{id}")public void deleteUser(@PathVariable Long id) {// ...}
    

5. 完整示例


@RestController@RequestMapping("/api")public class UserController {// 1. 路径变量 + 查询参数@GetMapping("/user/{id}")public String getUser(@PathVariable Long id,@RequestParam(required = false, defaultValue = "false") Boolean details) {return "ID: " + id + ", Details: " + details;}// 2. JSON 请求体@PostMapping("/user")public User createUser(@RequestBody User user) {return userService.save(user);}// 3. 文件上传@PostMapping("/upload")public String upload(@RequestPart MultipartFile file,@RequestParam String description) {return "File: " + file.getOriginalFilename() + ", Desc: " + description;}// 4. 请求头 + Cookie@GetMapping("/meta")public String getMeta(@RequestHeader("User-Agent") String userAgent,@CookieValue("JSESSIONID") String sessionId) {return "UA: " + userAgent + ", Session: " + sessionId;}
}
http://www.dtcms.com/a/362237.html

相关文章:

  • LangGraph 边(Edge)机制完全指南
  • Java 不支持在非静态内部类中声明静态 Static declarations in inner classes are not supported异常处理
  • 2025我“生发”了『折行』|『内注』|『终端正偿』|『中文负偿』四大“邪术”(前二造福python代码阅读者;后二助力所有艺术人)
  • nrf52840 解锁
  • 2025年09月01日Github流行趋势
  • 数据结构初阶:详解栈和队列(下)——队列
  • 并发编程--线程池(1)线程池概念 Java 线程池体系(Executor、ThreadPoolExecutor、Executors)
  • resnet网络
  • 甲烷浓度时空演变趋势分析与异常值计算(附下载脚本)
  • 洛谷 P5836 [USACO19DEC] Milk Visits S-普及/提高-
  • 基于MCP架构的OpenWeather API服务端设计与实现
  • jetson开发板Ubuntu系统Docker中使用 MySQL 数据库详解-安装与配置指南
  • Python上下文管理器与资源管理
  • 基于51单片机停车场车位引导系统设计
  • 四个典型框架对比
  • 软考-操作系统-错题收集(2)文件系统的多级索引结构
  • 【重学MySQL】九十七、MySQL目录结构与文件系统解析
  • 二叉树核心操作知识点整理
  • 大模型微调显存内存节约方法
  • Java实现的IP4地址合法判断新思路
  • GPT - 5 技术前瞻与开发者高效接入路径探索​
  • 高性能客服系统源码实现
  • 文件上传漏洞基础及挖掘流程
  • 2013 NeuralIPS Translating Embeddings for Modeling Multi-relational Data
  • JAVA后端开发——MyBatis 结合 MySQL JSON 类型查询详解
  • vue组件中实现鼠标右键弹出自定义菜单栏
  • 智慧交通时代,数字孪生为何成为关键力量?
  • Map接口
  • 基于若依框架前端学习VUE和TS的核心内容
  • 手搓3D轮播图组件以及倒影效果