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

Spring Boot前端请求时的参数绑定

Spring Boot前端请求时的参数绑定在 Spring Boot 中处理前端请求时有多个关键的参数绑定注解。来聊聊这些注解的用法和区别。核心注解对比表注解作用位置获取来源适用场景示例RequestBody方法参数请求体JSON/XML接收复杂对象创建/更新操作PathVariable方法参数URL路径中的变量RESTful资源定位/users/{id}RequestParam方法参数URL查询参数简单参数过滤?name张三age20RequestHeader方法参数请求头获取Header信息Token、Content-TypeCookieValue方法参数Cookie获取Cookie值Session信息ModelAttribute方法参数多种来源表单数据绑定传统表单提交详细讲解每个注解1. RequestBody - 接收JSON数据用途从请求体中获取JSON数据自动转换为Java对象RestController RequestMapping(/api/users) public class UserController { // 创建用户 - 接收JSON对象 PostMapping public Result createUser(RequestBody UserDTO userDTO) { // 前端发送{name:张三,age:25,email:zhangsanexample.com} // Spring会自动将JSON转换为UserDTO对象 User user userService.create(userDTO); return Result.success(user); } // 批量创建 - 接收JSON数组 PostMapping(/batch) public Result batchCreate(RequestBody ListUserDTO userDTOs) { // 前端发送[{...}, {...}, {...}] ListUser users userService.batchCreate(userDTOs); return Result.success(users); } } // DTO类 public class UserDTO { private String name; private Integer age; private String email; // 必须有无参构造器 getters/setters }注意事项只支持POST、PUT、PATCH等有请求体的方法前端需要设置Content-Type: application/json默认不支持GET请求GET通常没有请求体2. PathVariable - 获取URL路径参数用途从URL路径中获取参数用于RESTful风格APIRestController RequestMapping(/api/users) public class UserController { // 获取单个用户 - /api/users/1 GetMapping(/{id}) public Result getUser(PathVariable Long id) { // {id} 对应 PathVariable 的 id User user userService.findById(id); return Result.success(user); } // 多个路径变量 - /api/users/1/orders/100 GetMapping(/{userId}/orders/{orderId}) public Result getOrder( PathVariable Long userId, PathVariable Long orderId) { Order order orderService.findById(userId, orderId); return Result.success(order); } // 指定变量名 - 当参数名与路径变量名不同时 GetMapping(/{uid}) public Result getUserById(PathVariable(uid) Long userId) { // 路径是{uid}但参数名是userId需要指定映射 return Result.success(userService.findById(userId)); } // 可选路径变量Spring 5 GetMapping({/profile, /profile/{userId}}) public Result getProfile(PathVariable(required false) Long userId) { if (userId null) { return Result.success(getCurrentUserProfile()); } return Result.success(userService.getProfile(userId)); } }3. RequestParam - 获取查询参数用途从URL的?后面获取参数RestController RequestMapping(/api/users) public class UserController { // 搜索用户 - /api/users/search?name张三age20 GetMapping(/search) public Result searchUsers( RequestParam String name, // 必需参数 RequestParam(required false) Integer age, // 可选参数 RequestParam(defaultValue 1) int page, // 默认值 RequestParam(defaultValue 10) int size) { ListUser users userService.search(name, age, page, size); return Result.success(users); } // 获取所有参数 - 使用Map接收 GetMapping(/filter) public Result filterUsers(RequestParam MapString, String params) { // /api/users/filter?name张三age20city北京 // params {name张三, age20, city北京} ListUser users userService.filter(params); return Result.success(users); } // 数组参数 - /api/users?ids1,2,3 或 /api/users?ids1ids2ids3 GetMapping public Result getUsersByIds(RequestParam ListLong ids) { ListUser users userService.findByIds(ids); return Result.success(users); } }4. RequestHeader - 获取请求头用途从HTTP请求头中获取信息RestController RequestMapping(/api) public class AuthController { GetMapping(/profile) public Result getProfile( RequestHeader(Authorization) String token, // 获取Token RequestHeader(value User-Agent, defaultValue Unknown) String userAgent, RequestHeader HttpHeaders headers) { // 获取所有Header // 验证Token if (!isValidToken(token)) { return Result.error(401, Token无效); } // 记录访问日志 log.info(User-Agent: {}, Accept: {}, userAgent, headers.getFirst(Accept)); UserProfile profile authService.getProfile(token); return Result.success(profile); } // 获取特定Header PostMapping(/upload) public Result uploadFile( RequestHeader(Content-Type) String contentType, RequestHeader(Content-Length) long contentLength) { if (!contentType.startsWith(multipart/)) { return Result.error(400, 只支持文件上传); } if (contentLength 10 * 1024 * 1024) { // 10MB限制 return Result.error(400, 文件大小超过限制); } return Result.success(文件上传成功); } }5. CookieValue - 获取Cookie用途从Cookie中获取值RestController RequestMapping(/api) public class SessionController { GetMapping(/cart) public Result getCart(CookieValue(sessionId) String sessionId) { // 从Cookie获取sessionId Cart cart cartService.getCart(sessionId); return Result.success(cart); } // 可选Cookie值 GetMapping(/preferences) public Result getPreferences( CookieValue(value theme, defaultValue light) String theme, CookieValue(value language, defaultValue zh-CN) String language) { UserPreferences prefs new UserPreferences(theme, language); return Result.success(prefs); } // 设置Cookie通过HttpServletResponse PostMapping(/login) public Result login(RequestBody LoginDTO loginDTO, HttpServletResponse response) { User user authService.login(loginDTO); // 设置Cookie Cookie sessionCookie new Cookie(sessionId, user.getSessionId()); sessionCookie.setHttpOnly(true); sessionCookie.setMaxAge(7 * 24 * 60 * 60); // 7天 sessionCookie.setPath(/); response.addCookie(sessionCookie); return Result.success(user); } }实际场景综合应用场景1用户管理CRUDRestController RequestMapping(/api/users) public class UserController { // 1. 查询用户列表分页过滤 - GET RequestParam // GET /api/users?page1size10name张status1 GetMapping public Result getUsers( RequestParam(defaultValue 1) int page, RequestParam(defaultValue 10) int size, RequestParam(required false) String name, RequestParam(required false) Integer status) { PageUser users userService.findUsers(page, size, name, status); return Result.success(users); } // 2. 查询单个用户 - GET PathVariable // GET /api/users/123 GetMapping(/{id}) public Result getUser(PathVariable Long id) { User user userService.findById(id); return Result.success(user); } // 3. 创建用户 - POST RequestBody // POST /api/users // Body: {name:张三,email:zhangsanexample.com,age:25} PostMapping public Result createUser(RequestBody UserDTO userDTO) { User user userService.create(userDTO); return Result.success(创建成功, user); } // 4. 更新用户 - PUT PathVariable RequestBody // PUT /api/users/123 // Body: {name:张三,age:26} PutMapping(/{id}) public Result updateUser( PathVariable Long id, RequestBody UserDTO userDTO) { User user userService.update(id, userDTO); return Result.success(更新成功, user); } // 5. 删除用户 - DELETE PathVariable // DELETE /api/users/123 DeleteMapping(/{id}) public Result deleteUser(PathVariable Long id) { userService.delete(id); return Result.success(删除成功); } // 6. 搜索用户 - GET RequestParam // GET /api/users/search?keyword张minAge20maxAge30 GetMapping(/search) public Result searchUsers( RequestParam String keyword, RequestParam(required false) Integer minAge, RequestParam(required false) Integer maxAge) { ListUser users userService.search(keyword, minAge, maxAge); return Result.success(users); } }场景2订单系统RestController RequestMapping(/api/orders) public class OrderController { // 创建订单 - 需要Token验证 PostMapping public Result createOrder( RequestBody OrderCreateDTO orderDTO, RequestHeader(Authorization) String token) { // 验证Token Long userId authService.getUserIdFromToken(token); // 创建订单 Order order orderService.createOrder(userId, orderDTO); return Result.success(订单创建成功, order); } // 获取用户订单列表 GetMapping(/my-orders) public Result getMyOrders( RequestHeader(Authorization) String token, RequestParam(defaultValue 1) int page, RequestParam(defaultValue 10) int size, RequestParam(required false) Integer status) { Long userId authService.getUserIdFromToken(token); PageOrder orders orderService.getUserOrders(userId, page, size, status); return Result.success(orders); } // 获取订单详情 GetMapping(/{orderId}) public Result getOrderDetail( PathVariable String orderId, RequestHeader(Authorization) String token) { Long userId authService.getUserIdFromToken(token); OrderDetailVO orderDetail orderService.getOrderDetail(userId, orderId); return Result.success(orderDetail); } // 取消订单 PutMapping(/{orderId}/cancel) public Result cancelOrder( PathVariable String orderId, RequestHeader(Authorization) String token, RequestParam(required false) String reason) { Long userId authService.getUserIdFromToken(token); orderService.cancelOrder(userId, orderId, reason); return Result.success(订单已取消); } }常见问题和注意事项1. 参数绑定失败// ❌ 问题缺少必需参数时报400 GetMapping public Result test(RequestParam String requiredParam) { // 如果请求没有传requiredParam会报400 } // ✅ 解决设置requiredfalse或默认值 GetMapping public Result test(RequestParam(required false) String optionalParam) { // 现在不传参也可以 }2. 类型转换错误// ❌ 问题传了非数字值 GetMapping(/{id}) public Result test(PathVariable Long id) { // 如果访问 /api/users/abc会报400无法将abc转为Long } // ✅ 解决在ControllerAdvice中统一处理 ControllerAdvice public class GlobalExceptionHandler { ExceptionHandler(MethodArgumentTypeMismatchException.class) public Result handleTypeMismatch(MethodArgumentTypeMismatchException ex) { return Result.error(400, 参数类型错误: ex.getName()); } }3. 多个同类型参数// ❌ 问题多个RequestBody PostMapping public Result test(RequestBody UserDTO user, RequestBody AddressDTO address) { // 错误一个请求只能有一个RequestBody } // ✅ 解决封装到一个DTO中 PostMapping public Result test(RequestBody OrderCreateDTO orderDTO) { // orderDTO中包含user和address }4. GET请求使用RequestBody// ❌ 问题GET请求不能用RequestBody GetMapping public Result test(RequestBody FilterDTO filter) { // 错误GET请求通常没有请求体 } // ✅ 解决用RequestParam或PathVariable GetMapping public Result test(RequestParam String name, RequestParam Integer age) { // 正确 }参数验证结合注解RestController RequestMapping(/api/users) public class UserController { PostMapping public Result createUser(Valid RequestBody UserDTO userDTO) { // Valid 会触发验证 User user userService.create(userDTO); return Result.success(user); } } // DTO类添加验证注解 public class UserDTO { NotBlank(message 用户名不能为空) Size(min 2, max 20, message 用户名长度2-20) private String name; NotNull(message 年龄不能为空) Min(value 1, message 年龄不能小于1) Max(value 150, message 年龄不能大于150) private Integer age; Email(message 邮箱格式不正确) private String email; Pattern(regexp ^1[3-9]\\d{9}$, message 手机号格式不正确) private String phone; }最佳实践总结RESTful设计查询用GETPathVariable/RequestParam创建用POSTRequestBody更新用PUTPathVariableRequestBody删除用DELETEPathVariable参数选择路径参数用PathVariable查询参数用RequestParamJSON数据用RequestBody认证信息用RequestHeader验证机制始终验证输入参数使用Valid进行自动验证提供清晰的错误信息安全性敏感信息不要放在URL中使用RequestHeader获取Token验证参数合法性记住这个简单的选择指南要获取资源→GetMappingPathVariable/RequestParam要提交数据→PostMapping/PutMappingRequestBody要身份验证→RequestHeader获取Token要参数过滤→RequestParam获取查询条件

相关文章:

Spring Boot前端请求时的参数绑定

Spring Boot前端请求时的参数绑定 在 Spring Boot 中处理前端请求时,有多个关键的参数绑定注解。来聊聊这些注解的用法和区别。 核心注解对比表注解作用位置获取来源适用场景示例RequestBody方法参数请求体(JSON/XML)接收复杂对象创建/更新操…...

fastjson-EnumDeserializer类及源码分析

本文以fastjson-1.2.83版本中 EnumDeserializer 类的源码,来解释其工作原理和实现细节。 🎯 类结构概览 EnumDeserializer 是 FastJSON 用于将 JSON 反序列化为枚举类型的核心类。它支持: 通过枚举名称(Enum.name())反序列化通过枚举序号(Enu…...

sse哈工大C语言编程练习45

2026 年 3 月 17 日 收获: 判断直角三角形时,两边的平方和减第三边的平方和小于 0.1 即可认为是直角三角形,主要看题目给的测试用例,确定精度。取余和除法第二个数都不能为 0,若遇到则输出错误提示信息,直接…...

Java面试题1000+附答案大全(合适各级Java开发人员)

作为一名优秀的程序员,技术面试都是不可避免的一个环节,一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识。 2026 年的互联网行业竞争越来越严峻,面试也是越来越难,很多粉丝朋友私信希望我出一篇面试专题或…...

迷你世界UGC3.0脚本Wiki数组变量数据管理接口 Array

迷你世界UGC3.0脚本WikiMenuOn this pageSidebar Navigation快速入门欢迎MOD、组件介绍什么是Lua编程组件介绍组件说明组件互相操作组件函数组件属性事件触发器事件管理组件事件管理函数库服务模块世界模块管理接口 World对象模块管理接口 GameObject角色模块管理接口 Actor玩家…...

Python 生成 PowerPoint 演示文件图表教程

免费编程软件「pythonpycharm」 链接:https://pan.quark.cn/s/48a86be2fdc0周五下午三点,部门群里弹出一条消息:"各位,下周一汇报的各季度运营数据PPT,今晚12点前发我合并。"小王盯着屏幕愣了五秒&#xff0…...

env SHARP_IGNORE_GLOBAL_LIBVIPS=1 npm --loglevel error --silent --no-fund --no-audit install -g open

根据你提供的错误信息,npm install 在安装 OpenClaw 时失败,可能涉及多个层面的原因。以下是系统化的排查与解决方案:一、核心问题定位 从错误日志 npm install failed for openclawlatest 和命令参数 SHARP_IGNORE_GLOBAL_LIBVIPS1 推测&…...

GESP2026年3月认证C++一级( 第三部分编程题(2)数字替换)

一、🌟故事:Alice讨厌数字41、Alice 是一个很可爱的同学,不过她有一个小小的习惯:她 不喜欢数字 4。(1)因为在很多地方:4 的谐音像 “死”(2)但她特别喜欢:8因…...

OpenClaw 引爆 AI Agent 革命,边缘计算才是真正的“决战场“

一个奥地利程序员,60天改写了开源历史2025 年底,奥地利开发者 Peter Steinberger 发布了一个小型开源项目——Clawdbot。Steinberger 并不是一个普通程序员。他是 PDF 软件公司 PSPDFKit 的创始人,这家公司曾被以约 1 亿欧元估值出售。在离开…...

前字节员工自曝:北京买房年薪百万,却不如在成都月薪3万活得明白

来自:推荐一个程序员编程资料站:http://cxyroad.com副业赚钱专栏:https://xbt100.top2024年IDEA最新激活方法后台回复:激活码CSDN免登录复制代码插件下载:CSDN复制插件以下是正文。一位前字节跳动员工在社交媒体的帖子…...

2026必备!10个降AI率软件降AIGC网站评测:开源免费必看,学术降重全维度推荐

在人工智能技术日益渗透学术领域的今天,论文写作中AI痕迹的识别和处理已成为学者们不得不面对的重要课题。随着AIGC率检测技术的不断升级,传统的AI生成内容更容易被系统识别并标记,这给论文的原创性和通过率带来了巨大挑战。而AI降重工具的出…...

拖延症福音!全行业通用降AIGC工具 千笔·降AIGC助手 VS 灵感风暴AI

在AI技术迅速发展的今天,越来越多的学生、研究人员和职场人士开始借助AI工具辅助论文写作,提升效率与质量。然而,随着学术审查标准的不断提高,AI生成内容的痕迹越来越容易被识别,导致论文面临“AI率超标”的风险。许多…...

三极管工作原理解析

三极管知识全面解析 1. 三极管基础概念与结构 1.1 基本定义 三极管(Transistor)是一种半导体器件,具有电流放大和开关作用,是现代电子技术的核心元件。三极管由三个掺杂不同的半导体区域构成,分别是发射区、基区和集电区。 1.2 类型分类 类型 结构特点 符号表示 主要特…...

从 O(n²) 暴力到 O(n·log n) 蝶形运算——OpenCV dft() 源码全链路拆解,附频域去条纹噪声实战

一、你的图像处理为什么需要频域? 做图像处理的程序员,十个里面有九个是从空间域起步的。模糊用 GaussianBlur(),锐化用拉普拉斯算子,去噪用中值滤波——这些操作直觉上很好理解,每个像素和它的邻居做一轮加权平均就完事了。 但总有一天你会碰到这样的场景:一张图片上出…...

2026鸿蒙开发认证全攻略:从零基础到持证通关,抢占生态红利

在万物互联时代,鸿蒙系统作为华为自主研发的分布式操作系统,正加速渗透智能终端、物联网、工业互联网等多个领域,成为国内科技产业自主可控的核心支撑。鸿蒙开发认证作为华为官方唯一权威的技能认证体系,不仅是检验开发者鸿蒙技术…...

2026红帽认证(RHCSA/RHCE/RHCA)全攻略:从零基础到架构师,解锁Linux运维高薪密码

在Linux运维、DevOps、云原生赛道竞争日趋激烈的今天,红帽认证(RHCSA/RHCE/RHCA)早已超越“技能证书”的范畴,成为企业筛选核心技术人才的“硬通货”、从业者突破职业瓶颈的“金钥匙”。不同于市面上侧重理论的认证,红…...

C++ 隐式类型转换全解析

C 隐式类型转换全解析(核心规则场景风险)参考回答: 首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于只存在 单个参数的构造函数的对象构造来说,函数调…...

SECURITY ISSUES [radio wave]

SECURITY ISSUES [radio wave] 无限设备的安全问题一直使用有线的我,其实有线比无线传输更加快,信号更加稳定,信号辐射也小,我能想到唯一的缺点就是费线和到处都是线!!!!...

Java入门第162课——HTML 基础语法与文档结构

1.1 Web 核心基础认知 1.1.1 Web 工作原理 Web 采用客户端 - 服务器(C/S) 架构,核心流程: 客户端(浏览器)通过 URL 向服务器发送请求; 服务器接收请求后处理,返回 HTML/CSS/JS 等资源; 浏览器解析资源,以图形化方式展示页面。 1.1.2 Web 相关技术分类 服务器端技术…...

智捷云软网关:数据采集的智能桥梁

前言 在物联网应用中,设备数据采集是核心环节之一。传统的硬件网关虽然稳定,但成本高、部署复杂、扩展性差。软网关作为一种新兴的解决方案,以其灵活、经济、易部署的特点,正在成为物联网数据采集的新选择。今天要为大家介绍的是…...

迷你世界UGC3.0脚本Wiki道具实例介绍

迷你世界UGC3.0脚本WikiMenuOn this pageSidebar Navigation快速入门欢迎MOD、组件介绍什么是Lua编程组件介绍组件说明组件互相操作组件函数组件属性事件触发器事件管理组件事件管理函数库服务模块世界模块管理接口 World对象…...

一文搞懂信息安全核心技术:加密、认证与数字证书——软件设计师备考指南

目录 一、对称加密 vs 非对称加密:两种核心加密范式 二、数字签名与信息摘要:保障完整性与不可否认性 三、数字证书:解决公钥信任问题 四、技术对比总结 五、常见误区纠正 非 VIP 用户可前往公众号“前端基地”进行免费阅读,文章链接如下…...

微软澄清:5年后不会用AI重写Win11,C语言也不会被淘汰

5年后将淘汰C语言 微软澄清:不会用AI重写Win11系统快科技官方原创作者2025.12.2421:28在快科技于12月24日所发布的消息当中,在这之前,有一位工程师,其在个人页面宣告,有相关情况表明微软会在2030年的时候删去全部用C以…...

工程人必备!批量CAD版本转换,效率提升 10 倍!

如果你负责一整套项目图纸,几十张甚至上百张 DWG 文件, 需要统一转换成低版本归档或发给施工方, 一张一张手动转换,不仅枯燥,还极其浪费时间。 浩辰 CAD 看图王的批量版本转换功能,就是为解决这类痛点而…...

MySQL--》快速提高查询效率:SQL语句优化技巧与实践

目录 插入数据 order by与group by优化 limit、count、update优化 插入数据 在对数据库当中进行插入数据操作,通常我们都会使用insert进行插入数据,可由于每次insert都会和数据库建立连接,频繁的插入数据就会导致效率上的降低&#xff0c…...

隧道环境有毒有害气体在线监测系统方案

利用物联网、数据采集、大数据分析等技术,通过构建稳定、可靠的工业物联网络,工业智能网关能够将实时数据准确、快速地传输至监控管理中心,实现数据可视化,助力管理员全面了解隧道运行期间的有毒气体浓度实时状况,并为…...

2026 本科毕业论文 AI 工具全景指南:从 Paperzz 到高效写作矩阵,一键解锁毕业季从容节奏

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 毕业论文-AIGC论文检测-AI智能降重-ai智能写作https://www.paperzz.cc/dissertation 又到本科毕业季,毕业论文成了无数学生的 “心头大山”:选题卡壳、文献难寻、图表公式无…...

华硕电脑键盘全部失灵

华硕电脑键盘全部失灵前言一、故障排查二、发现问题三、使用方法总结前言 故障情况描述: 键盘无法使用,键盘除开机键外全部失灵,关机后,如果没断电,键盘常亮 打开机器,故障复现,果然是完全失效…...

作为一个普通的程序员,到底应不应该转型AI大模型?

在程序员圈子中,技术转型近年来一直是热门话题。随着AI技术的迅猛发展,优秀人才短缺,程序员向AI大模型转型似乎成为了一条通往职场先机的路径。但是,这条转型之路是否容易走,成功率又如何呢?作为一个普通的…...

Java开发者AI转型大模型全攻略:4大方向+学习路径+避坑指南

本文探讨Java开发者如何在AI时代实现职业转型,提出四个方向:AI增强型工程师、AI工程化、垂直领域AI解决方案、AI产品化。详细阐述各方向目标、实践建议及优势,提供系统学习路径和资源推荐,并给出避免"调参侠"陷阱等实用…...