@RequestMapping的参数

参数名 核心作用 通俗理解
value/path 指定匹配的 URL 路径 告诉 Spring:"这个方法对应哪个地址"
method 指定匹配的 HTTP 请求方式(GET/POST 等) 告诉 Spring:"这个方法只处理哪种请求"
params 指定请求必须包含 / 不能包含某些参数 告诉 Spring:"只有带这些参数的请求才处理"
headers 指定请求必须包含 / 不能包含某些请求头 告诉 Spring:"只有带这些头的请求才处理"
consumes 指定请求体的媒体类型(Content-Type) 告诉 Spring:"只接收这种格式的请求体"
produces 指定响应体的媒体类型(Accept) 告诉 Spring:"只返回这种格式的响应"

1.value /path(指定 URL 路径)

这是最常用的参数,两个参数完全等价path 是 Spring 4.3 后新增的,更语义化),用来绑定请求的 URL 路径。

用法示例
复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
// 类级别:给所有方法加基础路径 /book
@RequestMapping("/book") 
public class BookController {

    // 方式1:只用 value(最常见)
    @RequestMapping(value = "/detail") 
    public String bookDetail() {
        return "匹配路径:/book/detail";
    }

    // 方式2:只用 path(和 value 效果一样)
    @RequestMapping(path = "/list") 
    public String bookList() {
        return "匹配路径:/book/list";
    }

    // 方式3:省略参数名(只有一个路径参数时,可简写)
    @RequestMapping("/search") 
    public String bookSearch() {
        return "匹配路径:/book/search";
    }

    // 方式4:匹配多个路径(数组形式)
    @RequestMapping(value = {"/info", "/desc"}) 
    public String bookInfo() {
        return "匹配路径:/book/info 或 /book/desc";
    }
}

核心要点

  • 类级别 + 方法级别的路径会自动拼接(比如上面的 /book + /detail = /book/detail);
  • 支持数组形式,一个方法可以匹配多个 URL 路径。

2. method(指定 HTTP 请求方式)

限定当前方法只处理某种 / 某些 HTTP 请求方式(GET/POST/PUT/DELETE 等),如果不指定,默认允许所有请求方式(不推荐)。

用法示例
复制代码
import org.springframework.web.bind.annotation.RequestMethod;

@RestController
@RequestMapping("/user")
public class UserController {

    // 只处理 GET 请求
    @RequestMapping(value = "/detail", method = RequestMethod.GET)
    public String getUser() {
        return "仅 GET 请求能访问 /user/detail";
    }

    // 只处理 POST 请求
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String addUser() {
        return "仅 POST 请求能访问 /user/add";
    }

    // 处理多种请求方式(GET + POST)
    @RequestMapping(value = "/edit", method = {RequestMethod.GET, RequestMethod.POST})
    public String editUser() {
        return "GET 或 POST 请求都能访问 /user/edit";
    }
}

核心要点

  • @GetMapping 就是 method=RequestMethod.GET 的简化版,@PostMapping 同理;
  • 如果请求方式不匹配,Spring 会返回 405 错误(Method Not Allowed)。

3. params(指定请求参数)

限定请求必须包含 / 不包含某些参数,才能匹配到这个方法,常用于 "同一个路径,不同参数走不同方法" 的场景。

用法示例(支持 4 种表达式)
复制代码
@RestController
@RequestMapping("/goods")
public class GoodsController {

    // 1. 必须包含参数 id(比如 /goods/detail?id=1)
    @RequestMapping(value = "/detail", params = "id")
    public String detailWithId() {
        return "请求必须带 id 参数";
    }

    // 2. 必须不包含参数 type(比如 /goods/list 不能带 type)
    @RequestMapping(value = "/list", params = "!type")
    public String listWithoutType() {
        return "请求不能带 type 参数";
    }

    // 3. 参数 id 必须等于 100(比如 /goods/info?id=100)
    @RequestMapping(value = "/info", params = "id=100")
    public String infoWithId100() {
        return "id 参数必须等于 100";
    }

    // 4. 参数 status 必须不等于 0(比如 /goods/state?status=1)
    @RequestMapping(value = "/state", params = "status!=0")
    public String stateWithStatusNot0() {
        return "status 参数不能等于 0";
    }

    // 5. 组合条件:必须包含 id,且不能包含 type
    @RequestMapping(value = "/query", params = {"id", "!type"})
    public String query() {
        return "必须带 id,不能带 type";
    }
}

4. headers(指定请求头)

限定请求必须包含 / 不包含某些请求头,常用于区分不同客户端、不同版本的请求。

用法示例
复制代码
@RestController
@RequestMapping("/api")
public class ApiController {

    // 1. 必须包含请求头:token(比如请求头里有 token=xxx)
    @RequestMapping(value = "/v1/user", headers = "token")
    public String v1User() {
        return "请求头必须带 token";
    }

    // 2. 请求头 Content-Type 必须是 application/json
    @RequestMapping(value = "/v2/user", headers = "Content-Type=application/json")
    public String v2User() {
        return "请求体必须是 JSON 格式";
    }

    // 3. 组合条件:必须带 token,且不能带 version=1.0
    @RequestMapping(value = "/v3/user", headers = {"token", "version!=1.0"})
    public String v3User() {
        return "带 token,且 version 不是 1.0";
    }
}

5. consumes(指定请求体格式)

限定请求的 Content-Type(请求体媒体类型),比如只接收 JSON 格式的请求体,不接收表单格式。

用法示例
复制代码
@RestController
@RequestMapping("/order")
public class OrderController {

    // 只接收 JSON 格式的请求体(Content-Type: application/json)
    @RequestMapping(value = "/create", method = RequestMethod.POST, consumes = "application/json")
    public String createOrder() {
        return "仅接收 JSON 格式的 POST 请求";
    }

    // 只接收表单格式的请求体(Content-Type: application/x-www-form-urlencoded)
    @RequestMapping(value = "/submit", method = RequestMethod.POST, consumes = "application/x-www-form-urlencoded")
    public String submitOrder() {
        return "仅接收表单格式的 POST 请求";
    }

    // 接收多种格式(JSON 或表单)
    @RequestMapping(value = "/save", method = RequestMethod.POST, consumes = {"application/json", "application/x-www-form-urlencoded"})
    public String saveOrder() {
        return "接收 JSON 或表单格式的 POST 请求";
    }
}

6. produces(指定响应体格式)

限定响应的媒体类型,同时会匹配请求头的 Accept 字段,比如只返回 JSON 格式,不返回 XML。

用法示例
复制代码
@RestController
@RequestMapping("/data")
public class DataController {

    // 只返回 JSON 格式(响应头 Content-Type: application/json)
    @RequestMapping(value = "/json", produces = "application/json")
    public String returnJson() {
        return "{\"name\":\"张三\",\"age\":20}";
    }

    // 只返回 XML 格式(响应头 Content-Type: application/xml)
    @RequestMapping(value = "/xml", produces = "application/xml")
    public String returnXml() {
        return "<user><name>张三</name><age>20</age></user>";
    }

    // 根据请求头 Accept 自动匹配(比如 Accept:application/json 返 JSON,Accept:application/xml 返 XML)
    @RequestMapping(value = "/auto", produces = {"application/json", "application/xml"})
    public String returnAuto() {
        return "根据请求头返回对应格式";
    }
}
相关推荐
beata5 分钟前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端
IT探险家7 分钟前
你的第一个 Java 程序就翻车?HelloWorld 的 8 个隐藏陷阱
java
随风飘的云8 分钟前
SpringBoot 的自动配置原理
java
SimonKing13 分钟前
觅得又一款轻量级数据库管理工具:GoNavi
java·后端·程序员
Seven971 小时前
BIO详解:解锁阻塞IO的使用方式
java
oak隔壁找我11 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪16 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷17 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
用户83071968408219 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
小兔崽子去哪了19 小时前
Java 自动化部署
java·后端