RestController和Controller

@RestController@Controller 是 Spring Framework 中用于处理 HTTP 请求的两个注解,主要用于定义控制器(Controller)类

@Controller

  • 用途: 用于标识一个类为 Spring MVC 控制器,处理请求并返回视图(通常是 JSP、Thymeleaf 等)。
  • 返回类型: 默认情况下,使用 @Controller 的方法返回的是视图名称(视图解析),需要与 @RequestMapping 一起使用来处理请求。
  • 示例:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/profile")
    public String getUserProfile() {
        return "profile"; // 返回视图名称
    }
}

2. @RestController

  • 用途: 是 @Controller 的一个变体,专用于处理 RESTful API 的请求。它自动将返回对象转换为 JSON 或 XML 格式。
  • 返回类型: 默认情况下,@RestController 方法返回的是数据(如 Java 对象),会被自动序列化为 JSON,通常用于 RESTful 服务。
  • 示例:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserRestController {

    @GetMapping("/api/user")
    public User getUser() {
        return new User(1, "John Doe"); // 返回 User 对象,会自动转换为 JSON
    }
}

@RestController 实际上是 @Controller@ResponseBody 的组合

@Controller

  • 基本功能: 用于定义一个控制器,处理 HTTP 请求。
  • 返回视图: 默认情况下,@Controller 的方法返回的是一个视图名称,Spring 会根据这个名称找到对应的视图(如 JSP 或 Thymeleaf 模板)并渲染它。

@ResponseBody

  • 基本功能: 用于指示 Spring 将方法的返回值直接写入 HTTP 响应体,而不是视图名称。
  • 返回数据: 当方法上使用了 @ResponseBody 注解,Spring 会自动将返回的对象序列化成 JSON 或 XML,并发送给客户端。

@RestController

  • 组合功能: @RestController 是一个方便的注解,它实际上是 @Controller@ResponseBody 的组合。
  • 自动响应数据: 所有 @RestController 中的方法返回的对象都将被自动序列化为 JSON,并写入响应体中,适合构建 RESTful API。

举例

使用 @Controller@ResponseBody

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {

    @GetMapping("/data")
    @ResponseBody
    public User getData() {
        return new User(1, "John Doe"); // 直接返回对象
    }
}

在上面的例子中,@ResponseBody 注解用于指示 Spring 将 getData 方法的返回值直接写入响应体。

使用 @RestController

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {

    @GetMapping("/api/data")
    public User getData() {
        return new User(1, "John Doe"); // 自动转换为 JSON
    }
}

在这个例子中,@RestController 直接实现了与 @Controller + @ResponseBody 相同的效果,但写法更简洁。

总结

  • @Controller: 用于传统的 MVC 模式,通常返回视图名称,适合处理网页请求。
  • @RestController: 专门用于 RESTful API,自动将返回值转换为 JSON 格式,适合处理数据请求。

选择使用哪一个注解取决于你的应用需求:如果是返回 HTML 视图,使用 @Controller;如果是返回数据(JSON/XML),使用 @RestController

  • @RestController = @Controller + @ResponseBody
  • 使用 @RestController 更方便,尤其是在构建 RESTful API 时,因为它自动处理返回值的序列化和响应体的写入。
  • 如果你只使用 @Controller,且需要返回 JSON 数据,就必须在每个需要的地方加上 @ResponseBody

项目分区导航MyBatis-MyBatis-plus ⬅️ | 04-RestController和Controller | ➡️ 加密原理