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

news/2024/10/22 16:36:27/

引言

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


http://www.ppmy.cn/news/1425757.html

相关文章

现代软件为什么要采用微服架构

现代软件采用微服务架构是为了解决传统单体架构在开发、部署和维护大型应用时面临的一系列问题。以下是采用微服务架构的主要优势&#xff1a; 1. **模块化和组件化**&#xff1a;微服务通过将应用拆分为一系列小型、松耦合的服务来提高模块化水平。每个服务都是围绕特定的业务…

【蓝桥杯 2020 国 B】美丽的 2 题解(Excel+提交答案)

问题描述 小蓝特别喜欢 2, 今年是公元 2020 年&#xff0c; 他特别高兴。他很好奇&#xff0c; 在公元 1 年到公元 2020 年&#xff08;包含&#xff09;中&#xff0c; 有多少个年份的数位中包含数字 2? 答案提交 这是一道结果填空的题&#xff0c; 你只需要算出结果后提交…

面试: 悲观锁和乐观锁

一、悲观锁的代表是synchronized和Lock 锁 其核心思想是【线程只有占有了锁&#xff0c;才能去操作共享变量&#xff0c;每次只有一个线程占锁成功&#xff0c;获取锁失败的线程&#xff0c;都得停下来等待】线程从运行到阻塞、再从阻塞到唤醒&#xff0c;涉及线程上下文切换&a…

数据结构- 顺序表-单链表-双链表 --【求个关注!】

文章目录 一 顺序表代码&#xff1a; 二 链表单链表双向链表 一 顺序表 顺序表是线性表的一种 所谓线性表指一串数据的组织存储在逻辑上是线性的&#xff0c;而在物理上不一定是线性的 顺序表的底层实现是数组&#xff0c;其由一群数据类型相同的元素组成&#xff0c;其在逻辑…

WEB 前端优化--一起学习吧之架构

Web前端优化是一个综合性的过程&#xff0c;需要从多个方面入手。通过不断优化和改进&#xff0c;可以提高网站的性能和用户体验&#xff0c;吸引更多用户访问和留存。 一、关键步骤和策略 压缩和优化资源&#xff1a; 压缩HTML、CSS、JavaScript等文件&#xff0c;减少文件大…

单链表(详解)

目录 一.链表的介绍二.链表的各种方法单链表的结构初始化链表为链表开辟新节点打印链表尾插头插尾删头删查找指定位置之前插入指定位置之后插入删除(pos)节点删除节点&#xff08;pos&#xff09;之后的节点链表的销毁&#xff08;节点被一个一个地销毁&#xff09; 一.链表的介…

JAVA 集合框架(四) Map集合详解和常用方法

Map集合是Java集合框架中的一个重要组成部分&#xff0c;它以键值对&#xff08;key-value pairs&#xff09;的形式存储数据。Map集合中的每个键都是唯一的&#xff0c;因此它不允许键的重复&#xff0c;而每个键可以关联一个值&#xff0c;同一键可以对应不同的值&#xff08…

桥接模式【结构型模式C++】

1.概述 桥接模式是一种结构型设计模式&#xff0c;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&am…