首页 > 其他分享 >Spring 中的 @RestController 注解详解

Spring 中的 @RestController 注解详解

时间:2025-01-09 09:30:43浏览次数:3  
标签:RestController name Spring class 详解 user public String

@RestController 是 Spring MVC 中常用的注解,通常用于构建 RESTful Web 服务。它是 @Controller 和 @ResponseBody 的组合,简化了开发 RESTful 接口的流程。

本文将详细介绍 @RestController 的使用场景、原理以及具体案例。


1. @RestController 的作用

@RestController 的主要作用是将类标记为一个 RESTful 控制器。

  • 类中的每个方法返回的数据会直接写入 HTTP 响应体(Response Body)。
  • 默认不需要额外使用 @ResponseBody 注解。

简而言之@RestController 自动将方法返回的对象序列化为 JSON 或 XML 格式。


2. @RestController 与 @Controller 的区别

特性@RestController@Controller
返回值默认行为数据直接写入响应体(默认返回 JSON)。视图解析,返回页面模板(如 JSP、HTML)。
是否需要 @ResponseBody不需要额外标注,自动序列化返回值。若需返回数据而非页面,需要加 @ResponseBody

示例:

  • @RestController 示例

    @RestController
    public class UserController {
        @GetMapping("/user")
        public User getUser() {
            return new User("John", 25);
        }
    }
    

    返回结果为 JSON:

    {
        "name": "John",
        "age": 25
    }
    
  • @Controller 示例

    @Controller
    public class PageController {
        @GetMapping("/page")
        public String getPage() {
            return "home"; // 返回页面模板名称,如 home.html
        }
    }
    

3. 如何使用 @RestController

3.1 基本使用

以下是一个完整的使用案例,展示如何创建一个返回 JSON 数据的接口。

实体类
public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
控制器类
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user")
    public User getUser() {
        return new User("Alice", 30);
    }
}
启动类

确保项目启动时,Spring Boot 能扫描到 @RestController 标注的类。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

结果:
访问 http://localhost:8080/api/user,将返回:

{
    "name": "Alice",
    "age": 30
}

3.2 参数传递
通过 URL 参数
@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user")
    public String getUserByName(@RequestParam String name) {
        return "Hello, " + name;
    }
}

访问 http://localhost:8080/api/user?name=Tom,返回:

Hello, Tom
通过路径变量
@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user/{id}")
    public String getUserById(@PathVariable int id) {
        return "User ID: " + id;
    }
}

访问 http://localhost:8080/api/user/123,返回:

User ID: 123

3.3 POST 请求

在 RESTful 接口中,POST 通常用于创建资源。以下是处理 POST 请求的示例:

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class UserController {

    @PostMapping("/user")
    public String createUser(@RequestBody User user) {
        return "User " + user.getName() + " created successfully!";
    }
}

测试请求:
发送以下 JSON 数据到 http://localhost:8080/api/user

{
    "name": "John",
    "age": 28
}

返回结果:

User John created successfully!

4. 常见注解组合

4.1 @RequestMapping

@RequestMapping 用于定义请求路径,可以与 @RestController 配合使用:

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, World!";
    }
}

访问路径为 http://localhost:8080/api/hello

4.2 @GetMapping@PostMapping 等

简化了 HTTP 方法的映射:

  • @GetMapping:映射 GET 请求。
  • @PostMapping:映射 POST 请求。
  • @PutMapping:映射 PUT 请求。
  • @DeleteMapping:映射 DELETE 请求。

5. 最佳实践

  1. 使用统一的 API 前缀
    为 REST 接口添加统一的前缀(如 /api),便于接口管理:

    @RestController
    @RequestMapping("/api/v1")
    public class UserController { ... }
    
  2. 返回自定义响应格式
    使用统一响应结构,便于前后端协作:

    public class ApiResponse<T> {
        private int code;
        private String message;
        private T data;
    
        public ApiResponse(int code, String message, T data) {
            this.code = code;
            this.message = message;
            this.data = data;
        }
    
        // Getters and Setters
    }
    
    @RestController
    @RequestMapping("/api")
    public class UserController {
        @GetMapping("/user")
        public ApiResponse<User> getUser() {
            User user = new User("Alice", 30);
            return new ApiResponse<>(200, "Success", user);
        }
    }
    
  3. 异常处理
    通过 @RestControllerAdvice 实现全局异常处理:

    @RestControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(Exception.class)
        public ApiResponse<String> handleException(Exception e) {
            return new ApiResponse<>(500, "Internal Server Error", e.getMessage());
        }
    }
    

6. 总结

@RestController 是 Spring 提供的 RESTful Web 开发核心注解,它大大简化了返回 JSON 数据的接口开发流程。通过结合其他注解(如 @GetMapping@PostMapping),开发者可以快速构建强大、灵活的 RESTful API。

如果你刚开始接触 Spring MVC 或 RESTful 开发,@RestController 是你学习的重要一环!

标签:RestController,name,Spring,class,详解,user,public,String
From: https://blog.csdn.net/q68686/article/details/145023580

相关文章

  • 【BUG排查记】HttpUtil和SpringSecurity结合的坑
    一、背景最近为了做微服务高可用和优化上线流程,我参与了一个微服务的改造开发。主要包括redis切换哨兵模式、接入高可用xxljob集群、配置和升级脚本优化。二、问题描述  项目改造提测后,测试发现一个依赖远程http调用的功能不可用三、问题分析  查看......
  • 2025毕设springboot 病人跟踪治疗系统设计与实现论文+源码
    系统程序文件列表开题报告内容研究背景在现代医疗体系中,病人跟踪治疗是确保患者康复的重要环节。随着人口老龄化和慢性病患者的增多,医疗资源的分配和管理变得日益复杂。传统的纸质病历记录方式不仅效率低下,还容易出错,无法满足现代医疗对高效、精准、全面跟踪治疗的需求。因......
  • 2025毕设springboot 病理科室病例跟踪系统论文+源码
    系统程序文件列表开题报告内容研究背景在现代医疗体系中,病理科室作为疾病诊断的关键环节,承担着对组织、细胞等生物样本进行深入分析的重任。随着医疗技术的不断进步和患者需求的日益增长,病理科室的工作量和复杂性也随之增加。传统的病例管理方式,如纸质记录、人工跟踪等,已难......
  • 基于Springboot的灾害应急救援平台设计和实现
    ......
  • 基于Springboot的网络相册设计和实现
    ......
  • 基于Springboot的学生请假管理系统设计和实现
    ......
  • 【分布式技术】Springboot集成zookeeper
    文章目录作为服务发现步骤1:添加依赖步骤2:配置Zookeeperapplication.propertiesapplication.yml步骤3:启用服务发现步骤4:运行你的应用注意事项作为客户端使用场景1.**配置管理**2.**命名服务(NameService)**3.**分布式锁**4.**集群管理**5.**选举主节点(LeaderElecti......
  • windows C#-泛型类型参数的约束详解(二)
    未绑定的类型参数没有约束的类型参数(如公共类SampleClass<T>{}中的T)称为未绑定的类型参数。未绑定的类型参数具有以下规则:不能使用!=和==运算符,因为无法保证具体的类型参数能支持这些运算符。可以在它们与System.Object之间来回转换,或将它们显式转换为任何接口......
  • windows C#-泛型类型参数的约束详解(一)
    使用约束的原因约束指定类型参数的功能和预期。声明这些约束意味着你可以使用约束类型的操作和方法调用。如果泛型类或方法对泛型成员使用除简单赋值之外的任何操作,包括调用System.Object不支持的任何方法,则对类型参数应用约束。例如,基类约束告诉编译器,只有此类型的对象......
  • JAVA开源免费项目 基于Vue和SpringBoot的技术交流分享平台(附源码)
    博主说明:本文项目编号T053,文末自助获取源码\color{red}{T053,文末自助获......