SpringBoot接口获取参数的常用注解详解

 更新时间:2026年01月31日 11:20:50   作者:一线大码  
SpringBoot 接口获取参数的注解非常丰富,这篇文章主要为大家详细介绍了一些常用参数注解的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

SpringBoot 接口获取参数的注解非常丰富,下面详细介绍一下常用的参数注解:

1、URL 路径参数

@PathVariable

获取 URL 路径中的参数

// 获取单个参数
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id) {
    return userService.findById(id);
}

// 获取多个参数
@GetMapping("/user/{id}/post/{postId}")
public String getInfo(
    @PathVariable Long id,
    @PathVariable Long postId
) {
    // ...
}

// 参数名不一致时指定
@GetMapping("/user/{userId}")
public User getUser(@PathVariable("userId") Long id) {
    return userService.findById(id);
}

// 获取所有路径变量(Map形式)
@GetMapping("/user/{id}/post/{postId}")
public String getInfo(@PathVariable Map<String, String> pathVariables) {
    return pathVariables.get("id");
}
// URL路径中的时间参数
@GetMapping("/events/date/{date}")
public List<Event> getEventsByPathDate(
    @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
    return eventService.findByDate(date);
}

@GetMapping("/events/datetime/{datetime}")
public String getByDateTime(
    @PathVariable @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime datetime) {
    return "时间: " + datetime;
}

2. 查询参数(URL 参数)

@RequestParam

获取 URL 查询字符串参数

// 必填参数
@GetMapping("/users")
public List<User> getUsers(@RequestParam String name) {
    return userService.findByName(name);
}

// 可选参数
@GetMapping("/users")
public List<User> getUsers(
    @RequestParam(required = false) String name,
    @RequestParam(defaultValue = "1") int page,
    @RequestParam(defaultValue = "10") int size
) {
    return userService.findByName(name, page, size);
}

// 接收多个值
@GetMapping("/users")
public List<User> getUsers(@RequestParam List<Long> ids) {
    return userService.findByIds(ids);
}

// 获取所有查询参数(Map形式)
@GetMapping("/search")
public String search(@RequestParam Map<String, String> params) {
    return params.get("keyword");
}
// 查询参数中的时间
@GetMapping("/events")
public List<Event> getEventsByDate(
    @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date date) {
    return eventService.findByDate(date);
}

// 多个时间参数
@GetMapping("/events/range")
public List<Event> getEventsByRange(
    @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
    @RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime) {
    return eventService.findByDateRange(startDate, endTime);
}

3. 请求体参数

@RequestBody

获取 JSON/XML 格式的请求体

@PostMapping("/user")
public User createUser(@RequestBody User user) {
    return userService.save(user);
}

// 接收 Map 类型的请求体
@PostMapping("/data")
public String processData(@RequestBody Map<String, Object> data) {
    return data.toString();
}

// 使用 DTO 接收参数
@PostMapping("/register")
public ResponseEntity<?> register(@RequestBody RegisterDTO registerDTO) {
    // 处理注册逻辑
    return ResponseEntity.ok("注册成功");
}

@ModelAttribute

获取表单数据(支持 GET/POST)

// 绑定到对象
@PostMapping("/user")
public String createUser(@ModelAttribute User user) {
    userService.save(user);
    return "success";
}

// 绑定到 Map
@PostMapping("/user")
public String createUser(@ModelAttribute Map<String, Object> model) {
    return model.get("name").toString();
}

4. 请求头参数

@RequestHeader

获取 HTTP 请求头信息

@GetMapping("/info")
public String getInfo(
    @RequestHeader("User-Agent") String userAgent,
    @RequestHeader(value = "Authorization", required = false) String auth,
    @RequestHeader Map<String, String> headers
) {
    return "User-Agent: " + userAgent;
}

5. Cookie 参数

@CookieValue

获取 Cookie 中的值

@GetMapping("/profile")
public String getProfile(@CookieValue("sessionId") String sessionId) {
    return "Session ID: " + sessionId;
}

// 可选参数
@GetMapping("/profile")
public String getProfile(
    @CookieValue(value = "sessionId", defaultValue = "default") String sessionId
) {
    return "Session ID: " + sessionId;
}

6. 文件上传参数

@RequestPart

获取文件上传内容

@RequestPart处理 multipart/form-data 请求中的复杂数据类型,支持文件上传和混合表单数据(如 JSON + 文件)。

特性@RequestPart@RequestParam
数据格式支持任何内容类型(如 JSON、XML)仅支持 application/x-www-form-urlencoded
内容类型每个部分有独立的 Content-Type整个请求统一的 Content-Type
数据处理使用 HttpMessageConverter使用 Servlet API 的参数解析
文件处理天然支持文件上传,支持其他类型仅支持文件(作为 MultipartFile)
JSON 绑定直接绑定到对象不支持
主要应用场景上传文件同时发送 JSON 数据‌:如用户上传头像并附带用户信息(JSON)。
单个请求中混合不同类型的数据‌:如同时上传多个文件和表单数据。
REST API 中的文件上传‌:如上传图片并附带元数据(JSON)。
@RestController
@RequestMapping("/api/upload")
public class UploadController {
    // 基础文件上传
    @PostMapping("/single")
    public String uploadSingle(@RequestPart("file") MultipartFile file) {
        return "Uploaded: " + file.getOriginalFilename();
    }

    // 多文件上传
    @PostMapping("/multiple")
    public String uploadMultiple(@RequestPart("files") MultipartFile[] files) {
        return "Uploaded " + files.length + " files";
    }

    // 文件 + JSON对象
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String uploadData(@RequestPart("file") MultipartFile file, 
                             @RequestPart("metadata") MyMetadata metadata) {
        // metadata 是自定义的 JSON 对象
        return "Uploaded file with metadata";
    }
    
    // 文件 + 表单字段
    @PostMapping(value = "/upload-with-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public ResponseEntity<?> uploadWithData(
                                            @RequestPart("file") MultipartFile file,
                                            @RequestParam("name") String name,
                                            @RequestParam("description") String description) {
        // 处理文件和文本数据
        return ResponseEntity.ok("上传成功");
    }
}

常见错误及解决方法:

  • 忘记设置 consumes = "multipart/form-data"‌:导致无法解析请求。
  • 文件大小超过默认限制‌:需配置 spring.servlet.multipart.max-file-size 和 spring.servlet.multipart.max-request-size。

与 @RequestBody 的区别:

  • @RequestBody 用于处理 application/json 或 application/xml 格式的请求体数据。
  • @RequestPart 用于处理 multipart/form-data 中的复杂数据类型(如 JSON + 文件)。

@RequestParam

@PostMapping("/upload-simple")
public String uploadSimple(@RequestParam("file") MultipartFile file) {
    return "文件名称: " + file.getOriginalFilename();
}

7. 会话和属性参数

@SessionAttribute

获取会话属性

@GetMapping("/dashboard")
public String dashboard(@SessionAttribute("user") User user) {
    return "欢迎 " + user.getUsername();
}

@RequestAttribute

获取请求域属性

@GetMapping("/process")
public String process(@RequestAttribute("processedData") String data) {
    return "处理后的数据: " + data;
}

8. 其他特殊注解

@MatrixVariable

获取矩阵变量(不常用)

// URL: /cars;color=red;year=2023
@GetMapping("/cars")
public String getCar(@MatrixVariable String color) {
    return color;
}

@Value(从配置获取)

@GetMapping("/config")
public String getConfig(@Value("${app.name}") String appName) {
    return "应用名称: " + appName;
}

到此这篇关于SpringBoot接口获取参数的常用注解详解的文章就介绍到这了,更多相关SpringBoot接口获取参数注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • package打包一个springcloud项目的某个微服务报错问题

    package打包一个springcloud项目的某个微服务报错问题

    这篇文章主要介绍了package打包一个springcloud项目的某个微服务报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring Boot中使用Actuator的/info端点输出Git版本信息

    Spring Boot中使用Actuator的/info端点输出Git版本信息

    这篇文章主要介绍了Spring Boot中使用Actuator的/info端点输出Git版本信息,需要的朋友可以参考下
    2017-06-06
  • 大厂禁止SpringBoot在项目使用Tomcat容器原理解析

    大厂禁止SpringBoot在项目使用Tomcat容器原理解析

    这篇文章主要为大家介绍了大厂禁止SpringBoot在项目使用Tomcat原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Java多线程atomic包介绍及使用方法

    Java多线程atomic包介绍及使用方法

    这篇文章主要介绍了Java多线程atomic包介绍及使用方法,涉及原子更新基本类型介绍及代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • springcloud feign 接口指定接口服务ip方式

    springcloud feign 接口指定接口服务ip方式

    这篇文章主要介绍了springcloud feign 接口指定接口服务ip方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • SpringCache快速使用及入门案例

    SpringCache快速使用及入门案例

    Spring Cache 是Spring 提供的一整套的缓存解决方案,它不是具体的缓存实现,本文主要介绍了SpringCache快速使用及入门案例,感兴趣的可以了解一下
    2023-08-08
  • java简单手写版本实现时间轮算法

    java简单手写版本实现时间轮算法

    这篇文章主要为大家详细介绍了java简单手写版本实现时间轮算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • SpringBoot 集成 Statemachine的实战指南

    SpringBoot 集成 Statemachine的实战指南

    本文介绍了Spring State Machine框架的基本概念、核心特性、注解驱动开发方式以及如何在Spring Boot项目中集成状态机,通过状态机,可以有效地管理复杂的状态流转逻辑,文章还讨论了状态机的持久化问题,并提供了一个自定义持久化实现的示例,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • Java NIO中的零拷贝原理

    Java NIO中的零拷贝原理

    这篇文章主要介绍了Java NIO中的零拷贝原理,零拷贝即Zero-Copy,顾名思义,零拷贝是指的一种非拷贝的方式来减少IO次数的工作方式,零拷贝的作用就是减少IO,提高IO效率,需要的朋友可以参考下
    2023-11-11
  • Mybatis关于动态排序 #{} ${}问题

    Mybatis关于动态排序 #{} ${}问题

    这篇文章主要介绍了Mybatis关于动态排序 #{} ${}问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10

最新评论