🔧 一、@RestController 是什么?
简单定义:
@RestController 是 Spring 4 之后引入的注解,本质上是:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
}
等价于:
@Controller
@ResponseBody
也就是说,@RestController 是一个复合注解,标注在类上时,表示:
- 这个类是一个 Spring 的控制器类(
@Controller) - 这个类中的所有方法返回的对象都会直接序列化为 JSON/XML 等内容输出到 HTTP 响应体中(
@ResponseBody)
🧩 二、详细解释组成部分
1. @Controller
是 Spring MVC 的核心注解,表示当前类是一个 Web 控制器。Spring 会扫描带有该注解的类,将其注册为一个 Bean,并处理其中的 HTTP 请求映射方法。
@Controller
public class MyController {
@RequestMapping("/test")
public String test() {
return "hello";
}
}
上面的代码会返回一个视图名
"hello",然后去找hello.html页面(使用 Thymeleaf 之类的模板引擎)。
2. @ResponseBody
表示方法的返回值会被直接写入 HTTP 响应体中,不会走视图解析器。
例如:
@Controller
public class MyController {
@RequestMapping("/json")
@ResponseBody
public String jsonTest() {
return "hello";
}
}
返回的就是纯字符串 hello,而不是去找视图。
所以:@RestController 相当于对类中每个方法都默认加了 @ResponseBody,更适合做 API 接口。
🌐 三、使用场景
1. RESTful API 开发
最常见的使用场景就是开发 JSON API,比如前后端分离项目,前端是 Vue、React、Angular,后端是 Spring Boot,就会用 @RestController。
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getById(id); // 自动转成 JSON 返回
}
}
2. 返回 JSON、XML 等格式响应
Spring 会使用 HttpMessageConverter(如 Jackson、Gson)自动将对象序列化为客户端需要的格式。
📦 四、Spring 中的数据转换机制
当你返回一个 Java 对象时(比如 User),Spring 会通过 HttpMessageConverter 机制,把对象自动转换为 JSON 或 XML:
- 如果引入了 Jackson(
spring-boot-starter-web默认引入),就转为 JSON。 - 如果客户端请求头带
Accept: application/xml,且你配置了 XML 的 converter,就转为 XML。
@GetMapping("/info")
public User getUserInfo() {
return new User("张三", 20);
}
浏览器或前端请求这个接口时,响应结果是:
{
"name": "张三",
"age": 20
}
🧪 五、对比 @Controller 和 @RestController
| 特性 | @Controller | @RestController |
|---|---|---|
| 是否用于 Web 控制器 | ✅ 是 | ✅ 是 |
| 返回是否默认走视图解析 | ✅ 是(返回视图名) | ❌ 否(返回 JSON 或文本) |
是否默认加上 @ResponseBody | ❌ 否,需要手动加 | ✅ 是,所有方法都默认加 |
| 适用场景 | 页面跳转、模板渲染 | RESTful API 接口开发(前后端分离) |
🚀 六、常见误区
❌ 用 @RestController 返回页面:
@RestController
public class PageController {
@GetMapping("/login")
public String login() {
return "login"; // ❌ 会直接返回字符串 login,而不是跳转 login.html 页面
}
}
正确做法:
@Controller
public class PageController {
@GetMapping("/login")
public String login() {
return "login"; // ✅ 返回 login.html 页面
}
}
✅ 七、小结
| 点 | 内容 |
|---|---|
| 注解 | @RestController 是 @Controller + @ResponseBody |
| 用途 | 开发 RESTful API,返回 JSON、文本等响应 |
| 原理 | 使用 Spring 的 HttpMessageConverter 自动转换返回对象 |
| 特点 | 返回值不会被当作视图名解析,而是作为响应体直接返回 |
| 场景 | 前后端分离项目、移动端接口、第三方平台对接 |
1304

被折叠的 条评论
为什么被折叠?



