@RequestMapping注解的各个属性作用

1.default-consumes-media-type: multipart/form-datadefault-produces-media-type: application/json

default-consumes-media-type: multipart/form-datadefault-produces-media-type: application/json 常见于 API 规范(如 OpenAPI)或某些框架(如 Spring、JAX-RS、Micronaut)的配置上下文,用于定义接口默认的请求内容类型默认的响应内容类型

含义解释

  • default-consumes-media-type: multipart/form-data

    表示接口默认接收的请求数据格式为 multipart/form-data

    • 该格式常用于文件上传混合表单数据(文本字段+文件)。

    • 请求体被划分为多个部分(parts),每个部分可携带不同的数据类型和编码。

    • 示例:用户头像上传、带附件的表单提交。

  • default-produces-media-type: application/json

    表示接口默认返回的数据格式为 application/json

    • 响应体是标准的 JSON 结构化数据。

    • 当前大多数 REST API 使用此格式进行数据交换,易于解析和调试。

典型使用场景

  • 你正在编写一个文件上传 + 返回 JSON 消息的 API,例如:

    客户端通过 multipart/form-data 上传图片,服务端处理后返回 {"status": "success", "url": "..."}

  • OpenAPI (Swagger)Spring MVC 中,可以在全局/类级别设定默认的 consumesproduces,避免每个接口重复声明。例如:

    Spring Boot 示例

    java

    复制代码
    @RequestMapping(
        consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
        produces = MediaType.APPLICATION_JSON_VALUE
    )
    public class FileController { ... }

    OpenAPI 3 全局配置(YAML 片段)

    yaml

    复制代码
    openapi: 3.0.0
    # 某些工具允许设置默认 consumes/produces,但标准写法是在路径或操作层指定

注意事项

  • 这些是默认值,你仍然可以为某个具体操作覆盖它们(例如某个接口只接收 JSON,或返回纯文本)。

  • 如果你的接口不是全局统一使用 multipart/form-data 请求,建议谨慎设置默认值,避免错误地要求所有请求都必须使用该格式。

  • multipart/form-data 的请求在 OpenAPI 3 中需要搭配 requestBody.content.multipart/form-data.schema 描述各 part 的结构。

2.@RequestMapping及派生注解

@RequestMapping 源码是 Spring Web 中所有请求映射的根本注解。下面我会逐属性解释,并说明它与 @PostMapping@GetMapping 等派生注解的关系。


一、@RequestMapping 各属性含义与作用

属性 类型 默认值 作用说明
name String "" 为映射指定一个逻辑名称,用于辅助工具(如 Swagger)生成文档或在日志中识别,不参与实际匹配。
value / path String[] {} 两者互为别名,用于指定请求的 URI 路径模式 。支持通配符、路径变量。例如 "/users""/users/{id}"
method RequestMethod[] {} 限制 HTTP 请求方法(GET, POST, PUT, DELETE...)。若不指定,则匹配所有 HTTP 方法。
params String[] {} 限制请求参数条件。要求请求必须包含/不包含某些参数,或参数值等于/不等于某个值。例如 "version=2""!draft"
headers String[] {} 限制 HTTP 请求头条件。语法与 params 类似,例如 "X-Requested-With=XMLHttpRequest"
consumes String[] {} 限制请求的 媒体类型 (即 Content-Type 头)。仅当客户端发送的 Content-Type 匹配时才会匹配,否则返回 415。例如 "application/json"
produces String[] {} 限制响应的 媒体类型 (通过 Accept 头协商)。若客户端 Accept 不匹配则返回 406,同时会设置响应 Content-Type。例如 "application/json"

注:valuepath 通过 @AliasFor 互称为别名,因此两者等价;若都不指定,则默认映射到类或方法所在路径的相对路径(例如类上 @RequestMapping("/api"),方法上无路径,则方法映射到 /api)。


二、@PostMapping@GetMapping 等是如何派生出来的?

Spring 提供了多个 组合注解 (Composed Annotation),每个都固定了 method 属性,并继承了 @RequestMapping 的所有其他能力。例如:

java

复制代码
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
    // 通过 @AliasFor 将属性桥接到 @RequestMapping
}
注解 固定 method 等价写法
@GetMapping RequestMethod.GET @RequestMapping(method = GET)
@PostMapping RequestMethod.POST @RequestMapping(method = POST)
@PutMapping RequestMethod.PUT @RequestMapping(method = PUT)
@DeleteMapping RequestMethod.DELETE @RequestMapping(method = DELETE)
@PatchMapping RequestMethod.PATCH @RequestMapping(method = PATCH)

以你给出的 @PostMapping 源码为例:

java

复制代码
@RequestMapping(method = {RequestMethod.POST})   // 元标注,固定为 POST
public @interface PostMapping {
    @AliasFor(annotation = RequestMapping.class) String name() default "";
    @AliasFor(annotation = RequestMapping.class) String[] value() default {};
    @AliasFor(annotation = RequestMapping.class) String[] path() default {};
    // ... 其他属性同样通过 @AliasFor 桥接到 @RequestMapping
}
  • 开发者使用 @PostMapping 时,无需再写 method = POST

  • 所有 @AliasFor 声明的属性,最终会"传值"给元注解 @RequestMapping 的同名属性。

  • 因此 @PostMapping("/user") 等价于 @RequestMapping(value = "/user", method = POST)

为什么需要这些派生注解?

  1. 简化 :减少重复编写 method = ...

  2. 语义清晰:注解名称直接表达了 HTTP 方法。

  3. 便于静态检查:IDE 或代码扫描工具可以更准确地识别 HTTP 操作。


三、实际使用对照示例

使用 @RequestMapping(完整写法)

java

复制代码
@RestController
public class UserController {
    @RequestMapping(value = "/users", method = RequestMethod.POST, consumes = "application/json")
    public User create(@RequestBody User user) { ... }
}

等价的 @PostMapping 写法

java

复制代码
@PostMapping(value = "/users", consumes = "application/json")
public User create(@RequestBody User user) { ... }

同时使用类级别 + 方法级别

java

复制代码
@RequestMapping("/api/v1")   // 类前缀
@RestController
public class UserController {
    @PostMapping("/users")   // 实际路径 = /api/v1/users
    public User create(...) { ... }
}

四、总结表:@RequestMapping vs 派生注解

注解 是否固定 method 主要用途
@RequestMapping 否(默认匹配所有) 通用映射,或需要动态方法(如自定义条件)
@GetMapping 是(GET) 查询、获取资源
@PostMapping 是(POST) 创建资源
@PutMapping 是(PUT) 整体更新资源
@DeleteMapping 是(DELETE) 删除资源
@PatchMapping 是(PATCH) 部分更新资源

记住 :所有派生注解本质上都是 @RequestMapping 的"特化版本",它们共享相同的路径匹配、参数、头、媒体类型等约束能力,但强制了一类 HTTP 方法。在日常开发中,为了代码简洁和语义清晰,推荐优先使用 @GetMapping@PostMapping 等具体注解,仅在需要非常规方法(如 OPTIONSTRACE)或动态方法时再直接使用 @RequestMapping

相关推荐
Yeh2020582 小时前
request与response笔记
java·前端·笔记
程序员老邢2 小时前
【产品底稿 07】商助慧 Admin 运维模块落地:从 “能跑” 到 “能运维”,3 个页面搞定日常排障
java·运维·经验分享·spring boot·后端
元宝骑士2 小时前
Spring @Async 异步无法获取当前登录用户?Sa-Token 1.34.0 终极踩坑解决方案
java·后端
0xDevNull2 小时前
Java项目中Redis热点Key自动检测方案详细教程
java·spring boot·redis
一嘴一个橘子3 小时前
MP 自定义业务方法 (三)
java
一叶飘零_sweeeet3 小时前
AI Agent 深潜:六大核心模块的设计本质与 Java 实现
java·人工智能·agent
向往着的青绿色3 小时前
Java反序列化漏洞(持续更新中)
java·开发语言·计算机网络·安全·web安全·网络安全·网络攻击模型
Carsene3 小时前
第一章:为什么我们需要“类型安全”的 SQL DSL 框架?
java·sql
wyu729613 小时前
Spring MVC 学习笔记:配置、注解、RESTful、JSON、拦截器、SSM整合、文件上传下载
java