开发者

Spring中@RestController和@Controller的使用及区别

目录
  • Spring中@RestController和@Controller使用及区别
    • 1. 基本定义
    • 2. 使用场景
    • 3. 使用示例
    • 4. 与 @Controller 的对比
    • 5. 常用注解配合使用
    • 6. 返回 jsON 数据
    • 7. 常见问题
    • 8. 特性总结
  • 总结

    Spring中@RestController和@Controller使用及区别

    @RestControllerSpring 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 页面)。

    示例对比:

    @R编程estController 示例

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

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

    @Controller 示例

    @Controller
    @ReHgVAEquestMapping("/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(www.devze.com) {
            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
    }

    请求数据:

    {
        "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

    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
    }

    返回结果:

    {
        "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。

    总结

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

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜