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

2025-03-22 14:50

本文主要是介绍Spring中@RestController和@Controller的使用及区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Spring中@RestController和@Controller的使用及区别》:本文主要介绍Spring中@RestController和@Controller的使用及区别,具有很好的参考价...

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 通常用于返回视图页面(如 htmlJSP)。

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.chinasem.cntMapping("/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.chinasem.cn) {
        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 是必不可少的工具之一。

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

这篇关于Spring中@RestController和@Controller的使用及区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153882

相关文章

Spring MVC使用视图解析的问题解读

《SpringMVC使用视图解析的问题解读》:本文主要介绍SpringMVC使用视图解析的问题解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC使用视图解析1. 会使用视图解析的情况2. 不会使用视图解析的情况总结Spring MVC使用视图

Springboot如何配置Scheduler定时器

《Springboot如何配置Scheduler定时器》:本文主要介绍Springboot如何配置Scheduler定时器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Springboot配置Scheduler定时器1.在启动类上添加 @EnableSchedulin

Spring Boot 集成 Quartz 使用Cron 表达式实现定时任务

《SpringBoot集成Quartz使用Cron表达式实现定时任务》本文介绍了如何在SpringBoot项目中集成Quartz并使用Cron表达式进行任务调度,通过添加Quartz依赖、创... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

基于@RequestParam注解之Spring MVC参数绑定的利器

《基于@RequestParam注解之SpringMVC参数绑定的利器》:本文主要介绍基于@RequestParam注解之SpringMVC参数绑定的利器,具有很好的参考价值,希望对大家有所帮助... 目录@RequestParam注解:Spring MVC参数绑定的利器什么是@RequestParam?@

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批

SpringBoot中配置文件pom.xml的使用详解

《SpringBoot中配置文件pom.xml的使用详解》SpringBoot的pom.xml文件是Maven项目的核心配置文件,用于定义项目的依赖、插件、构建配置等信息,下面小编就来和大家详细介绍一... 目录1. 基本结构2. 关键部分详解2.1 <modelVersion>2.2 项目坐标2.3 <p

Java中Integer128的坑

《Java中Integer128的坑》本文主要介绍了Java中Integer128的坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in