@RequestMapping注解的各个属性作用

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

default-consumes-media-type: multipart/form-data 和 default-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 中,可以在全局/类级别设定默认的 consumes 和 produces,避免每个接口重复声明。例如:

    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"。

注:value 与 path 通过 @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 等具体注解,仅在需要非常规方法(如 OPTIONS、TRACE)或动态方法时再直接使用 @RequestMapping。

相关推荐
源码宝4 分钟前
云HIS系统源码,HIS全套源码,支持监管系统对接与二次开发
java·源码·电子病历·云his系统·程序代码·全套源码
萧瑟余晖9 分钟前
Spring MVC拦截器异常处理与跨域详解
java·spring·mvc
泡茶喝茶写代码18 分钟前
A股量化数据工程:从 REST 接口到策略信号(第 17 篇):创新高与新低扫描
java·python·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
栗子~~29 分钟前
java - logstash-logback-encoder 集成 demo
java·开发语言·logback
hmb↑41 分钟前
高并发与高可用技术经验
java·spring
楚识科技1 小时前
XML配置OCR接入实战:自定义OCR模板从字段定义到API调用全流程
xml·java·ocr
小蒜学长2 小时前
基于Java的公司采购系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·公司采购系统
lee_tianbai2 小时前
Java SSM 电影票预定系统|完整前后端项目,开箱即用(源码分享)
java·开发语言·数据库
小坏讲微服务2 小时前
Spring Boot 4 新特性全解析:从上手到生产实战
java·spring boot·后端·架构·springboot4
砚底藏山河2 小时前
python量化入门:多周期数据对齐统一时间轴
java·数据库·python·金融·maven