Spring Boot 中 Controller 接口参数注解全攻略与实战案例详解

引言

在 Spring Boot 应用程序中,Controller 是 MVC 架构模式中的核心组件之一,负责处理 HTTP 请求并返回响应结果。为了更好地映射请求、解析请求参数、执行业务逻辑和生成视图或 JSON 数据,Controller 中广泛使用了各种注解。本文将全面梳理 Spring Boot 中 Controller 接口所使用的各类注解及其具体使用案例。

一、Controller 类级别的注解

1. 控制器类注解

@Controller

java 复制代码
import org.springframework.stereotype.Controller;

@Controller
public class MyController {
    // ...
}

用途:标记一个类作为Spring MVC的控制器,此类中包含的方法将被映射为HTTP请求处理器。

2. RESTful控制器注解

java 复制代码
@RestController
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {
    // ...
}

用途:@RestController是一个组合注解,它同时包含了@Controller和@ResponseBody,意味着该控制器的所有方法都将直接返回JSON、XML或者其他类型的数据而不是视图名。

二、路径映射注解

@RequestMapping

java 复制代码
@RequestMapping
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/api/v1")
public class MyApiV1Controller {
    @RequestMapping("/users")
    public ResponseEntity<List<User>> getAllUsers() {
        // ...
    }
}

用途:它可以放在类或方法上,用于指定控制器类或者方法处理的请求的基本URL路径。

三、 方法级别的路径映射注解

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping

java 复制代码
import org.springframework.web.bind.annotation.*;

@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
    // ...
}

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
    // ...
}

@PutMapping("/users/{id}")
public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
    // ...
}

@DeleteMapping("/users/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
    // ...
}

用途:这些注解分别对应HTTP的GET、POST、PUT和DELETE方法,用于精确映射HTTP请求到相应的方法。

四、 方法参数注解

@PathVariable

java 复制代码
@GetMapping("/users/{userId}/details")
public UserDetails getUserDetails(@PathVariable("userId") Long userId) {
    // ...
}

用途:从URL模板变量中提取值,并将其绑定到方法参数。

@RequestParam

java 复制代码
@GetMapping("/search")
public List<User> searchUsers(
    @RequestParam(name = "name", required = false) String name,
    @RequestParam(defaultValue = "10") int limit) {
    // ...
}

用途:从请求的查询参数中获取值。

@RequestBody

java 复制代码
@PostMapping("/users")
public User createUser(@RequestBody User newUser) {
    // ...
}

用途:将整个HTTP请求体转换成Java对象。

@RequestHeader

java 复制代码
@GetMapping("/headers")
public String getHeaderValue(@RequestHeader("Authorization") String authHeader) {
    // ...
}

用途:从请求头中提取指定名称的值。

@CookieValue

java 复制代码
@GetMapping("/cookies")
public String getCookie(@CookieValue(value = "JSESSIONID", defaultValue = "") String sessionId) {
    // ...
}

用途:从请求的cookie中提取指定名称的值。

@ModelAttribute

java 复制代码
@ModelAttribute("userForm")
public UserForm setUpUserForm() {
    return new UserForm();
}

@PostMapping("/register")
public String register(@ModelAttribute("userForm") UserForm userForm) {
    // ...
}

作用:用于将请求参数自动绑定到模型属性对象,或者在方法体内填充模型属性。

五、其他增强型注解

@ModelAttribute 用于方法参数时,它可以从模型中查找已有的属性,或者通过调用方法来创建新的属性。

@Valid 结合 JSR-303/JSR-349 Bean Validation 使用,对方法参数进行数据校验。

java 复制代码
@PostMapping("/register")
public String register(@Valid @ModelAttribute("userForm") UserForm userForm, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        // ...
    }
    // ...
}

六、全局异常处理和日志记录

@ControllerAdvice: 用于创建全局异常处理器,处理所有Controller中抛出的异常。

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(UserNotFoundException.class)
    public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {
        // ...
    }
}

通过以上示例,我们展示了Spring Boot中Controller接口常见的注解及其实际应用场景。根据具体需求,开发者可以选择合适的注解以构建功能完备且健壮的RESTful API。

相关推荐
四七伵9 分钟前
一次 Git Rebase 事故,让我彻底明白 Rebase 和 Merge 的区别
git·后端
摇滚侠10 分钟前
面试实战 问题三十二 Java中创建对象的几种方式
java·面试·职场和发展
程序员爱钓鱼14 分钟前
Go语言实战案例:静态资源服务(CSS、JS、图片)
后端·google·go
shark_chili19 分钟前
送书活动:《Go语言高级编程》免费领!
后端
程序员爱钓鱼20 分钟前
Go语言实战案例:接入支付宝/微信模拟支付回调接口
后端·google·go
BestAns24 分钟前
Java中如何判断两个值是否相等?一篇文章讲透比较机制
java
freed_Day31 分钟前
Java进阶学习之Stream流的基本概念以及使用技巧
java·开发语言·学习
Q_Q51100828535 分钟前
python的滑雪场雪具租赁服务数据可视化分析系统
spring boot·python·信息可视化·django·flask·node.js·php
Goboy38 分钟前
血泪教训,JSONObject的引用导致我周末双休没有了
后端·面试·架构
Warren9844 分钟前
Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
java·开发语言·分布式·学习·算法·mybatis·dubbo