Spring中@RestController注解的使用实现

 更新时间:2025年08月22日 10:42:40   作者:Hello-ZHE  
@RestController是SpringMVC中用于构建RESTful Web服务的核心注解,结合@Controller和@ResponseBody功能,自动将方法返回值序列化为JSON/XML,感兴趣的可以了解一下

@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.最佳实践

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

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

返回自定义响应格式
使用统一响应结构,便于前后端协作:

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);
    }
}

异常处理
通过 @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中@RestController注解的使用实现的文章就介绍到这了,更多相关Spring @RestController内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot全局异常捕获及try catch区别解析

    Springboot全局异常捕获及try catch区别解析

    这篇文章主要介绍了Springboot全局异常捕获及try catch区别解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java如何不解压读取.zip的文件内容

    Java如何不解压读取.zip的文件内容

    这篇文章主要给大家介绍了关于Java如何不解压读取.zip的文件内容的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java随机验证码生成实现实例代码

    java随机验证码生成实现实例代码

    这篇文章主要介绍了java随机验证码生成实现实例代码的相关资料,需要的朋友可以参考下
    2017-05-05
  • springboot结合mybatis操作事务配置的处理

    springboot结合mybatis操作事务配置的处理

    在操作数据库的时候,经常会使用事务的处理,本文主要介绍了springboot结合mybatis操作事务配置的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • Java实现滑动验证码生成(后端工具类)

    Java实现滑动验证码生成(后端工具类)

    这篇文章主要为大家详细介绍了Java实现滑动验证码生成功能中的后端工具类部分,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-10-10
  • 使用Java校验SQL语句的合法性五种解决方案

    使用Java校验SQL语句的合法性五种解决方案

    这篇文章主要介绍了如何用java校验SQL语句的合法性(提供五种解决方案),使用JDBC API和JSqlParser库、正则表达式、ANTLR解析器生成器或Apache Calcite库都可以实现校验SQL语句的合法性,需要的朋友可以参考下
    2023-04-04
  • Java的类型擦除式泛型详解

    Java的类型擦除式泛型详解

    Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。这篇文章主要介绍了Java的类型擦除式泛型,需要的朋友可以参考下
    2021-08-08
  • 简单了解SpringCloud运行原理

    简单了解SpringCloud运行原理

    这篇文章主要介绍了简单了解SpringCloud运行原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java向上转型与向下转型详解

    java向上转型与向下转型详解

    这篇文章主要为大家详细介绍了java向上转型与向下转型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • win10下定时运行与开机自启动jar包的方法记录

    win10下定时运行与开机自启动jar包的方法记录

    这篇文章主要给大家介绍了关于win10下定时运行与开机自启动jar包的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11

最新评论