当前位置: 首页 > 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.xdnf.cn/news/1426249.html

相关文章:

  • VBA开发者的福音:让代码效率暴涨300%的终极数据结构选择指南
  • 基于单片机智能空调/温度控制系统
  • 力扣404 代码随想录Day15 第三题
  • GitHub每日最火火火项目(9.1)
  • Java类和对象(下)
  • 二维元胞自动机:从生命游戏到自复制系统的计算宇宙
  • pprint:美观打印数据结构
  • 基于单片机十六路抢答器系统Proteus仿真(含全部资料)
  • Qt::Q_INIT_RESOURCE用法
  • 前端性能优化实战:如何高效管理和加载图片、字体、脚本资源
  • 在 Qt 中:QString 好,还是 std::string 好?
  • 零售行业的 AI 革命:从用户画像到智能供应链,如何让 “精准营销” 不再是口号?
  • 响应式编程框架Reactor【9】
  • 2.充分条件与必要条件
  • 基本问题解决--舵机
  • 手把手教你搭建 UDP 多人聊天室(附完整源码)
  • 10.《基础知识探秘:DHCP地址分配员》
  • 打工人日报#20250901
  • nCode 后处理常见问题汇总
  • C++精选面试题集合(100份大厂面经提取的200+道真题)
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享2
  • 【自记录】Ubuntu20.04下Python自编译
  • docker-nacos-v3
  • 在飞牛构建私有化协作环境GodoOS:集成文档、即时通讯、白板与思维导图!
  • 用只能以关键字指定和只能按位置传入的参数来设计清晰的接口(Effective Python 第25条)
  • Web知识的总结
  • Linux并发与竞争实验
  • Linux 下 MySQL 数据库定时备份脚本与 Crontab 配置
  • RK3588部署yolov8目标检测
  • Redis 的 SDS:像橡皮筋笔记本一样好用的字符串