@Controller 注解。 @RestController 和区别
时间: 2025-07-11 14:44:20 浏览: 22
### 控制器注解的核心区别
在 Spring 框架中,`@Controller` 和 `@RestController` 是用于处理 HTTP 请求的两个核心注解,但它们的应用场景和行为存在显著差异。
`@Controller` 注解用于标记一个类为控制器组件,其方法返回值通常是一个视图名称。Spring MVC 会通过视图解析器将该名称解析为实际的视图资源(如 HTML 页面),并将模型数据填充到视图中以呈现给客户端[^1]。这种类型的控制器适合传统的服务器端渲染模式,例如返回 `.html` 文件作为响应内容。
```java
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "index"; // 返回视图名称,由视图解析器解析
}
}
```
而 `@RestController` 则结合了 `@Controller` 和 `@ResponseBody` 的功能。它表示该类中的所有方法都会直接将返回值序列化为 HTTP 响应体,而不是经过视图解析器处理。这意味着返回的数据通常是 JSON 或 XML 格式,适用于构建 RESTful API 接口,特别适合前后端分离架构中后端仅提供数据服务的情况[^2]。
```java
@RestController
public class ApiController {
@GetMapping("/data")
public Map<String, Object> getData() {
Map<String, Object> response = new HashMap<>();
response.put("message", "Hello, World!");
return response; // 返回值自动转换为 JSON
}
}
```
若开发者尝试在使用 `@RestController` 的方法中返回视图名称,将会导致错误,因为框架不会进行视图解析操作[^3]。因此,在不确定是否需要返回页面的情况下,建议优先使用 `@Controller`,并在需要返回数据时手动添加 `@ResponseBody` 注解,以实现灵活的响应类型切换[^4]。
---
### 使用场景对比
| 场景 | 推荐注解 | 说明 |
|------|----------|------|
| 返回 HTML 页面(如 Thymeleaf、JSP) | `@Controller` | 配合视图解析器使用,适合传统 MVC 架构 |
| 提供 JSON/XML 数据接口 | `@RestController` | 默认返回数据格式,适用于 RESTful API |
| 同一控制器中混合返回页面和数据 | `@Controller` + `@ResponseBody` | 灵活控制方法返回类型 |
---
### 注意事项
- 在使用 `@RestController` 时,不应返回视图名称字符串,否则会导致视图解析失败。
- 若项目中包含模板引擎(如 Thymeleaf),确保依赖已正确引入,并且视图文件路径与控制器返回的视图名称匹配。
- 不推荐随意混用 `@Controller` 和 `@ResponseBody`,除非确实需要在同一控制器中支持多种响应类型。
---
阅读全文
相关推荐



















