1. 概述

本文将深入解析 Spring Web 模块中常用的注解,主要来自 org.springframework.web.bind.annotation 包。这些注解是构建 RESTful 接口和处理 HTTP 请求响应的核心工具,掌握它们能让你的开发更高效、代码更清晰。

对于有经验的开发者来说,这些注解早已是家常便饭,但其中一些细节和组合用法仍值得深挖,避免踩坑。

2. @RequestMapping

@RequestMapping 是 Spring Web 中最基础的注解之一,用于标记控制器中的请求处理方法。它可以配置以下属性:

  • value / path:指定该方法映射的 URL 路径
  • method:限定支持的 HTTP 方法(如 GET、POST)
  • params:根据请求参数的存在与否或值进行过滤
  • headers:根据请求头进行匹配
  • consumes:指定请求体可接受的媒体类型(如 application/json
  • produces:指定响应体返回的媒体类型

✅ 示例代码:

@Controller
class VehicleController {

    @RequestMapping(value = "/vehicles/home", method = RequestMethod.GET)
    String home() {
        return "home";
    }
}

⚠️ 注意:@RequestMapping 也可以用在类级别,作为该 Controller 下所有方法的公共前缀。此时方法级别的路径会与类级别的路径拼接,而不是覆盖。

例如,下面的写法与上面等价:

@Controller
@RequestMapping(value = "/vehicles", method = RequestMethod.GET)
class VehicleController {

    @RequestMapping("/home")
    String home() {
        return "home";
    }
}

✅ 小贴士:从 Spring 4.3 开始,引入了更语义化的衍生注解:

  • @GetMapping → 等价于 @RequestMapping(method = GET)
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

这些注解让代码意图更明确,推荐优先使用。

3. @RequestBody

@RequestBody 用于将 HTTP 请求体自动反序列化为 Java 对象,常用于接收 JSON 或 XML 数据。

Spring 会根据 Content-Type 头自动选择合适的 HttpMessageConverter 进行转换。

✅ 示例代码:

@PostMapping("/save")
void saveVehicle(@RequestBody Vehicle vehicle) {
    // vehicle 已经由 JSON 自动映射为对象
}

⚠️ 踩坑提醒:如果前端传的 JSON 字段与 Java 对象字段不匹配(比如大小写、命名风格),记得检查是否开启了 Jackson 的 @JsonProperty 或配置了全局命名策略。

4. @PathVariable

@PathVariable 用于绑定 URI 模板变量到方法参数。通常与 @RequestMapping 的路径占位符配合使用。

✅ 示例代码:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable("id") long id) {
    // /123 → id = 123
}

如果参数名与模板变量名一致,可以直接省略括号内的名称:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable long id) {
    // Spring 自动匹配
}

✅ 可选参数:通过设置 required = false 可将路径变量设为可选:

@RequestMapping("/{id}")
Vehicle getVehicle(@PathVariable(required = false) Long id) {
    // id 可为 null
}

⚠️ 注意:此时参数类型应为包装类(如 Long),否则基本类型无法接收 null

5. @RequestParam

@RequestParam 用于获取 HTTP 请求参数(query string 或 form data)

✅ 示例代码:

@RequestMapping
Vehicle getVehicleByParam(@RequestParam("id") long id) {
    // GET /?id=123 → id = 123
}

它也支持 requireddefaultValue 等配置。设置 defaultValue 后,required 会自动设为 false

@RequestMapping("/buy")
Car buyCar(@RequestParam(defaultValue = "5") int seatCount) {
    // 若未传 seatCount,默认值为 5
}

其他请求部分

除了参数,还可以通过以下注解获取:

  • @CookieValue:获取 Cookie 值
  • @RequestHeader:获取请求头信息

用法与 @RequestParam 类似,支持 defaultValuerequired 等属性。

6. 响应处理注解

这部分注解用于控制 HTTP 响应的行为。

6.1. @ResponseBody

@ResponseBody 表示方法返回值应直接作为响应体内容,而不是视图名。

✅ 示例代码:

@ResponseBody
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
    // 直接输出字符串,不走视图解析
}

如果加在 @Controller 类上,则该类所有方法都默认使用此行为。

6.2. @ExceptionHandler

用于定义自定义异常处理器。当控制器中抛出指定异常时,Spring 会调用该方法进行处理。

✅ 示例代码:

@ExceptionHandler(IllegalArgumentException.class)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // 统一处理非法参数异常
}

可以结合 @ResponseStatus 返回特定状态码。

6.3. @ResponseStatus

用于指定响应的 HTTP 状态码

  • code / value:设置状态码(如 HttpStatus.OK
  • reason:设置原因短语(可选)

✅ 常见用法:

@ExceptionHandler(IllegalArgumentException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
void onIllegalArgumentException(IllegalArgumentException exception) {
    // 返回 400 Bad Request
}

⚠️ 注意:@ResponseStatus 也可用于自定义异常类上,实现声明式状态码。

7. 其他常用 Web 注解

这些注解不直接处理请求/响应,但在实际开发中非常关键。

7.1. @Controller

标记一个类为 Spring MVC 的控制器组件。它是 @Component 的衍生注解,会被组件扫描自动注册为 Bean。

更多信息可参考 Spring Bean 相关注解。

7.2. @RestController

@RestController@Controller@ResponseBody 的组合注解,专用于构建 RESTful 接口。

✅ 以下两种写法等价:

@Controller
@ResponseBody
class VehicleRestController {
    // 所有方法返回值直接作为响应体
}
@RestController
class VehicleRestController {
    // 更简洁
}

✅ 推荐:现代 Spring Boot 项目中,REST 接口一律使用 @RestController

7.3. @ModelAttribute

有两个主要用途:

  1. 从模型中获取已有对象
@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute("vehicle") Vehicle vehicleInModel) {
    // 获取 Model 中 key 为 "vehicle" 的对象
}

若参数名与 model key 一致,可省略:

@PostMapping("/assemble")
void assembleVehicle(@ModelAttribute Vehicle vehicle) {
    // 自动绑定
}
  1. 将方法返回值自动加入 Model
@ModelAttribute("vehicle")
Vehicle getVehicle() {
    return new Vehicle();
    // 每次请求前都会执行,加入 model
}

可省略 key,Spring 默认使用方法名:

@ModelAttribute
Vehicle vehicle() {
    return new Vehicle();
}

⚠️ 执行时机:在请求处理方法执行前,所有 @ModelAttribute 方法都会被调用。

7.4. @CrossOrigin

用于开启跨域(CORS)支持,解决前端常见的 No 'Access-Control-Allow-Origin' 问题。

✅ 示例代码:

@CrossOrigin
@RequestMapping("/hello")
String hello() {
    return "Hello World!";
}

加在类上则对所有接口生效。

支持细粒度配置,如 originsmethodsallowedHeaders 等。

8. 总结

本文系统梳理了 Spring Web 开发中核心的注解体系,涵盖请求映射、参数绑定、响应处理及跨域等关键场景。

这些注解是构建现代 Web 应用的基石,熟练掌握不仅能提升开发效率,还能避免许多隐蔽的坑。建议结合实际项目多加练习,真正内化为自己的“肌肉记忆”。

文中所有示例代码均可在 GitHub 获取:https://github.com/tech-tutorial/spring-boot-annotations


原始标题:Spring Web Annotations