当前位置: 首页 > news >正文

Spring Boot @RestController 注解详解

Spring Boot @RestController 注解详解

@RestController 是 Spring Boot 中用于构建 RESTful Web 服务的核心注解,它将控制器类标记为 REST API 的入口点,简化了 RESTful 服务的开发。

概述

@RestController 是一个组合注解,它结合了 @Controller@ResponseBody 的功能。使用该注解的类中所有请求处理方法都会自动将返回值序列化为 JSON/XML 格式并写入 HTTP 响应体中。

基本语法结构

@RestController
@RequestMapping("基础路径")
public class ControllerName {@GetMapping("/路径")public ReturnType methodName(@RequestParam 参数类型 参数名) {// 处理逻辑return 返回值;}
}

核心特性

1. 组合注解特性

@RestController 相当于同时使用了 @Controller@ResponseBody

// 使用 @RestController(推荐)
@RestController
public class RoomController {@GetMapping("/room")public RoomEntity getRoom() {return new RoomEntity();}
}// 等价于下面的传统写法
@Controller
@ResponseBody
public class RoomController {@GetMapping("/room")public RoomEntity getRoom() {return new RoomEntity();}
}

2. 自动序列化返回值

所有方法返回值自动转换为 JSON/XML 格式:

@RestController
@RequestMapping("/api/rooms")
public class RoomController {// 返回对象自动序列化为 JSON@GetMapping("/{id}")public RoomEntity getRoom(@PathVariable Long id) {RoomEntity room = new RoomEntity();room.setId(id);room.setName("会议室");return room; // 自动转换为 JSON: {"id": 1, "name": "会议室"}}// 返回集合也自动序列化@GetMappingpublic List<RoomEntity> getAllRooms() {return Arrays.asList(new RoomEntity(), new RoomEntity());}
}

常用详解

1. 基本使用方式

@RestController
@RequestMapping("/api/rooms")
public class RoomController {@Autowiredprivate RoomService roomService;// GET /api/rooms - 获取房间列表@GetMappingpublic ResponseEntity<List<RoomEntity>> getAllRooms() {List<RoomEntity> rooms = roomService.findAll();return ResponseEntity.ok(rooms);}// GET /api/rooms/1 - 获取特定房间@GetMapping("/{id}")public ResponseEntity<RoomEntity> getRoom(@PathVariable Long id) {RoomEntity room = roomService.findById(id);return ResponseEntity.ok(room);}// POST /api/rooms - 创建新房间@PostMappingpublic ResponseEntity<RoomEntity> createRoom(@RequestBody RoomEntity room) {RoomEntity savedRoom = roomService.save(room);return ResponseEntity.status(HttpStatus.CREATED).body(savedRoom);}
}

2. 与 HTTP 方法注解配合

@RestController
@RequestMapping("/api/users")
public class UserController {// GET 请求 - 查询数据@GetMappingpublic List<User> getUsers() {return userService.findAll();}// GET 请求 - 根据 ID 查询@GetMapping("/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}// POST 请求 - 创建资源@PostMappingpublic User createUser(@RequestBody User user) {return userService.save(user);}// PUT 请求 - 更新整个资源@PutMapping("/{id}")public User updateUser(@PathVariable Long id, @RequestBody User user) {return userService.update(id, user);}// PATCH 请求 - 部分更新资源@PatchMapping("/{id}")public User patchUser(@PathVariable Long id, @RequestBody Map<String, Object> updates) {return userService.partialUpdate(id, updates);}// DELETE 请求 - 删除资源@DeleteMapping("/{id}")public void deleteUser(@PathVariable Long id) {userService.deleteById(id);}
}

关键说明

1. 与 @Controller 的区别

// @Controller - 通常用于返回视图名称
@Controller
public class WebController {@GetMapping("/page")public String getPage() {return "index"; // 返回视图名称}
}// @RestController - 用于返回数据
@RestController
public class ApiController {@GetMapping("/api/data")public Map<String, Object> getData() {return Map.of("message", "Hello World"); // 返回 JSON 数据}
}

2. 返回值处理机制

@RestController
public class DataController {// 1. 返回简单对象@GetMapping("/string")public String getString() {return "Hello World"; // 返回字符串}// 2. 返回复杂对象(自动转 JSON)@GetMapping("/object")public User getUser() {return new User("张三", 25); // 转换为 {"name": "张三", "age": 25}}// 3. 返回集合@GetMapping("/list")public List<User> getUsers() {return List.of(new User("张三", 25), new User("李四", 30));}// 4. 使用 ResponseEntity 提供更精确的控制@GetMapping("/response")public ResponseEntity<User> getResponseUser() {User user = new User("王五", 28);return ResponseEntity.ok().header("Custom-Header", "Value").body(user);}
}

注意事项

1. 不要与视图解析混用

// 错误示例 - 不要在 @RestController 中返回视图名称
@RestController
public class WrongController {@GetMapping("/page")public String getPage() {return "index"; // 这会返回字符串 "index" 而不是视图}
}// 正确示例 - 使用 @Controller 处理视图
@Controller
public class ViewController {@GetMapping("/page")public String getPage() {return "index"; // 返回视图名称}
}

2. 异常处理

@RestController
public class RoomController {@GetMapping("/{id}")public RoomEntity getRoom(@PathVariable Long id) {RoomEntity room = roomService.findById(id);if (room == null) {// 应使用统一异常处理机制throw new RoomNotFoundException("Room not found: " + id);}return room;}
}// 统一异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(RoomNotFoundException.class)public ResponseEntity<ErrorResponse> handleRoomNotFound(RoomNotFoundException e) {ErrorResponse error = new ErrorResponse("ROOM_NOT_FOUND", e.getMessage());return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);}
}

实用技巧

1. 统一响应格式

@RestController
public class RoomController {// 定义统一响应结构@GetMapping("/{id}")public ApiResponse<RoomEntity> getRoom(@PathVariable Long id) {RoomEntity room = roomService.findById(id);return ApiResponse.success(room);}
}// 统一响应类
public class ApiResponse<T> {private int code;private String message;private T data;public static <T> ApiResponse<T> success(T data) {ApiResponse<T> response = new ApiResponse<>();response.code = 0;response.message = "success";response.data = data;return response;}
}

2. 版本控制

@RestController
@RequestMapping("/api/v1/rooms")  // API 版本控制
public class RoomControllerV1 {// v1 版本的实现
}@RestController
@RequestMapping("/api/v2/rooms")  // API 版本控制
public class RoomControllerV2 {// v2 版本的实现
}

3. 分组管理

@RestController
@RequestMapping("/api/admin/rooms")  // 管理员接口
public class AdminRoomController {// 管理员专用接口
}@RestController
@RequestMapping("/api/public/rooms")  // 公共接口
public class PublicRoomController {// 公共可访问接口
}

命名规范建议

1. 控制器类命名

// 推荐命名方式 - 资源名 + Controller
@RestController
public class RoomController { }@RestController
public class UserController { }@RestController
public class OrderController { }

2. 路径命名规范

@RestController
@RequestMapping("/api/v1/rooms")        // 复数形式
public class RoomController { }@RestController
@RequestMapping("/api/v1/room-types")   // 多个单词使用连字符
public class RoomTypeController { }

总结:核心要点速览

特性说明
主要用途标记 RESTful API 控制器类
组合注解等价于 @Controller + @ResponseBody
自动序列化方法返回值自动转换为 JSON/XML
适用场景构建 REST API,不适用于视图渲染
路径映射通常与 @RequestMapping 配合使用
方法注解配合 @GetMapping@PostMapping
返回处理支持对象、集合、ResponseEntity 等类型
最佳实践遵循 RESTful 设计原则,统一响应格式

通过合理使用 @RestController 注解,可以快速构建功能完善、规范统一的 RESTful API 服务,是现代 Web 应用开发中不可或缺的重要组件。


文章转载自:

http://DhI8XXhc.pkwwq.cn
http://lu5JkCX7.pkwwq.cn
http://qrkRtC3d.pkwwq.cn
http://p3wWXINA.pkwwq.cn
http://fRAWnwIj.pkwwq.cn
http://EXgelDIh.pkwwq.cn
http://70y8hk33.pkwwq.cn
http://fXQHxkzb.pkwwq.cn
http://dJk5Orde.pkwwq.cn
http://U9CRR1gW.pkwwq.cn
http://SMaeEU3x.pkwwq.cn
http://kDtpjnCl.pkwwq.cn
http://YkEVwYuA.pkwwq.cn
http://d2epFikp.pkwwq.cn
http://98vQXhJL.pkwwq.cn
http://tVXB4Hi0.pkwwq.cn
http://U2fQlOL5.pkwwq.cn
http://blFEn2k2.pkwwq.cn
http://Je9YCGof.pkwwq.cn
http://Aif4yfac.pkwwq.cn
http://n8NdQAkV.pkwwq.cn
http://Df7yquin.pkwwq.cn
http://3w8v8XeA.pkwwq.cn
http://elncPuz2.pkwwq.cn
http://C7RxAWPp.pkwwq.cn
http://py4oUFrI.pkwwq.cn
http://G9Lm7ESI.pkwwq.cn
http://glDEQZn7.pkwwq.cn
http://zEZxIa0k.pkwwq.cn
http://AQ2WsCfq.pkwwq.cn
http://www.dtcms.com/a/371589.html

相关文章:

  • 腾讯云语音接口实现会议系统
  • ESP32与SUI-101A实现用电器识别
  • Wan2.2-S2V - 音频驱动图像生成电影级质量的数字人视频 ComfyUI工作流 支持50系显卡 一键整合包下载
  • 开始 ComfyUI 的 AI 绘图之旅-图生图(二)
  • VS2017安装Qt插件
  • ZYNQ FLASH读写
  • 容器元素的滚动条回到顶部
  • 【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现
  • ncnn-Android-mediapipe_hand 踩坑部署实录
  • java面试中经常会问到的mysql问题有哪些(基础版)
  • SoundSource for Mac 音频控制工具
  • Unity学习----【进阶】Input System学习(一)--导入与基础的设备调用API
  • 第11篇:降维算法:PCA、t-SNE、UMAP
  • 【Leetcode100】算法模板之二叉树
  • 深入理解假设检验:从抛硬币到药物实验的全景讲解
  • JavaScript笔记之JS 和 HTML5 的关系
  • 第4篇 conda install pytorch==2.0.0报错
  • 基于Echarts+HTML5可视化数据大屏展示-学生综合成绩评价系统大屏
  • 探索OpenResty:高性能Web开发利器
  • Lua 核心知识点详解
  • 26考研——内存管理_内存管理策略(3)
  • MySQL索引和B+Tree的关系
  • 《云原生配置危机:从服务瘫痪到韧性重建的实战全解》
  • 论文阅读-SelectiveStereo
  • 架构思维:重温限流算法原理与实战
  • 【面试题】关于RAG的五道题
  • redis的数据类型:List
  • 【mysql】SQL自连接:什么时候需要,什么时候不需要?
  • Android网络之WIFI技术网络模型概述
  • 【Pandas】3.1-数据预处理:列的基本操作