Spring 中的 @RestController 和 @Controller 的详解和区别

06-01 1605阅读

Spring 中的 @RestController 和 @Controller 的详解和区别

@RestController 是 Spring Web 提供的一个用来开发 RESTful Web 服务的关键注解,它是 @Controller 和 @ResponseBody 的组合注解。通过 @RestController,我们可以实现处理 HTTP 请求并直接返回 JSON、XML 或其他格式的数据,而不是返回视图页面。

以下是对 @RestController 注解的详细解析:


1. 基本定义

@RestController 的作用
  • 它是一个 标记类 的注解,标识该类是一个 Spring MVC 控制器,且所有方法的返回值会直接作为 HTTP 响应体(Response Body)。
  • 可以用来简化 RESTful API 的开发。
    注解的来源

    @RestController 是 Spring 4.0 引入的,属于 org.springframework.web.bind.annotation 包。

    组合关系

    它相当于 @Controller 和 @ResponseBody 的组合:

    @Target(value=TYPE)
    @Retention(value=RUNTIME)
    @Documented
    @Controller
    @ResponseBody
    public @interface RestController {
    }
    
    • @Controller:
      • 标识当前类是一个 Spring MVC 控制器,用于处理 HTTP 请求。
      • @ResponseBody:
        • 方法的返回值不会被解析为视图名称,而是直接写入 HTTP 响应体中。

          2. 使用场景

          @RestController 一般用于开发 RESTful 风格的服务接口,如前后端分离的项目中,前端通过 AJAX 或其他 Http 客户端调用后端接口,获取 JSON 或 XML 数据。

          与 @Controller 的区别在于:

          • @RestController 专注于返回数据(如 JSON、XML)。
          • @Controller 通常用于返回视图页面(如 HTML、JSP)。

            3. 使用示例

            示例 1:创建一个简单的 RESTful API
            import org.springframework.web.bind.annotation.*;
            @RestController
            @RequestMapping("/api/users")
            public class UserController {
                // GET 请求,获取用户信息
                @GetMapping("/{id}")
                public String getUserById(@PathVariable("id") Long id) {
                    return "User ID: " + id;
                }
                // POST 请求,创建新用户
                @PostMapping
                public String createUser(@RequestBody String user) {
                    return "User created: " + user;
                }
            }
            

            请求说明:

            1. @RestController 标注了 UserController 这个类是 RESTful 控制器。
            2. 返回值直接写入响应体,不需要额外使用 @ResponseBody。
            3. 示例中实现了两个接口:
              • 获取用户信息(GET /api/users/{id})。
              • 创建用户(POST /api/users)。

            4. 与 @Controller 的对比

            特性@RestController@Controller
            主要用途处理 RESTful Web 服务请求,返回 JSON 或 XML返回视图页面(如 Thymeleaf、JSP 等)。
            是否需要使用 @ResponseBody不需要,默认应用于所有方法返回值。需要单独为每个方法标注 @ResponseBody。
            返回内容数据(JSON、XML、文本等)。视图名称(如 Html 文件)。
            使用场景前后端分离的项目。传统 Web 应用(如返回 HTML 页面)。
            示例对比:
            1. @RestController 示例:

              @RestController
              @RequestMapping("/api")
              public class ApiController {
                  @GetMapping("/greeting")
                  public String greeting() {
                      return "Hello, World!";
                  }
              }
              

              返回结果:Hello, World! 作为纯文本响应。

            2. @Controller 示例:

              @Controller
              @RequestMapping("/web")
              public class WebController {
                  @GetMapping("/greeting")
                  public String greeting() {
                      return "greeting"; // 返回视图名称
                  }
              }
              

              返回结果:渲染名为 greeting.html 的视图。


            5. 常用注解配合使用

            5.1 配合 @RequestMapping

            @RequestMapping 用于指定类或方法的请求路径。可以与 @RestController 配合使用,设置 RESTful API 的基础路径。

            示例:
            @RestController
            @RequestMapping("/api")
            public class MyController {
                @GetMapping("/hello")
                public String sayHello() {
                    return "Hello, API!";
                }
            }
            

            请求路径:GET /api/hello


            5.2 配合 @GetMapping、@PostMapping
            • @GetMapping:用于处理 HTTP GET 请求。
            • @PostMapping:用于处理 HTTP POST 请求。
              示例:
              @RestController
              @RequestMapping("/users")
              public class UserController {
                  // GET 请求
                  @GetMapping("/{id}")
                  public String getUser(@PathVariable Long id) {
                      return "User ID: " + id;
                  }
                  // POST 请求
                  @PostMapping
                  public String createUser(@RequestBody String user) {
                      return "Created User: " + user;
                  }
              }
              

              5.3 配合 @RequestBody

              @RequestBody 将 JSON 请求体转换为 Java 对象。

              示例:
              @RestController
              @RequestMapping("/books")
              public class BookController {
                  @PostMapping
                  public String createBook(@RequestBody Book book) {
                      return "Created Book: " + book.getTitle();
                  }
              }
              class Book {
                  private String title;
                  private String author;
                  // Getter and Setter
              }
              

              请求数据:

              Spring 中的 @RestController 和 @Controller 的详解和区别
              (图片来源网络,侵删)
              {
                  "title": "Spring in Action",
                  "author": "Craig Walls"
              }
              

              5.4 配合 @PathVariable 和 @RequestParam
              • @PathVariable:从请求路径中获取变量。
              • @RequestParam:从查询参数中获取值。
                示例:
                @RestController
                @RequestMapping("/products")
                public class ProductController {
                    @GetMapping("/{id}")
                    public String getProduct(@PathVariable Long id, @RequestParam String name) {
                        return "Product ID: " + id + ", Name: " + name;
                    }
                }
                

                请求路径:GET /products/123?name=Phone

                返回结果:Product ID: 123, Name: Phone

                Spring 中的 @RestController 和 @Controller 的详解和区别
                (图片来源网络,侵删)

                6. 返回 JSON 数据

                @RestController 默认将返回值序列化为 JSON 格式(如果依赖的 Jackson 库存在)。

                示例:
                @RestController
                @RequestMapping("/users")
                public class UserController {
                    @GetMapping("/{id}")
                    public User getUser(@PathVariable Long id) {
                        return new User(id, "John");
                    }
                }
                class User {
                    private Long id;
                    private String name;
                    // Constructor, Getter, Setter
                }
                

                返回结果:

                Spring 中的 @RestController 和 @Controller 的详解和区别
                (图片来源网络,侵删)
                {
                    "id": 1,
                    "name": "John"
                }
                

                7. 常见问题

                7.1 返回值无法序列化
                • 如果返回的对象没有提供 getter 或没有无参构造函数,可能导致 JSON 序列化失败。
                • 解决方法:确保返回的对象有正确的 getter 和无参构造器。
                  7.2 404 Not Found 错误
                  • 检查请求路径是否正确。
                  • 确保控制器类和方法的 @RequestMapping 路径匹配。
                    7.3 415 Unsupported Media Type 问题
                    • 如果使用 @RequestBody,确保请求头中有 Content-Type: application/json。

                      8. 特性总结

                      特性描述
                      组合注解是 @Controller 和 @ResponseBody 的组合。
                      返回数据格式默认返回 JSON 数据(需要依赖 Jackson 库)。
                      适用场景RESTful API 开发,前后端分离项目接口开发。
                      简化开发不需要额外为每个方法添加 @ResponseBody。

                      9. 总结

                      • @RestController 是 Spring Web 提供的一个便捷注解,专用于处理 RESTful API 请求。
                      • 它简化了传统的 @Controller + @ResponseBody 的开发方式。
                      • 配合其他注解(如 @RequestMapping、@GetMapping、@RequestBody 等)可以快速开发健壮的 RESTful 服务。
                      • 在前后端分离的应用中,@RestController 是必不可少的工具之一。

                        如果有更多问题,可以继续问我!

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码