跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

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

Spring MVC 框架下,@Controller 与 @RestController 的核心差异在于返回值处理方式。前者默认依赖视图解析器渲染页面,后者则是前者的组合注解,自动包含 @ResponseBody 功能,直接将对象序列化为 JSON 等响应体,不再经过视图解析。选择哪个取决于接口是用于页面跳转还是数据交互。

指针猎手发布于 2020/4/5更新于 2026/10/2591 浏览
Spring 中 @Controller 与 @RestController 的区别详解

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

对于很多 Java 后端开发人员来说,使用注解开发确实能极大提升效率。但在实际项目中,选对注解往往决定了接口的行为。这里重点聊聊 @RestController 这个注解。

本质上,@RestController 是 @Controller 和 @ResponseBody 的组合注解。这意味着当你在这个类上使用它时,该类下的所有方法默认都会将返回值序列化为响应体(通常是 JSON),而不是视图名称。

如果你只使用 @Controller,Spring 通常会尝试寻找一个视图解析器(如 InternalResourceViewResolver)来渲染页面(比如 JSP)。如果此时你希望返回 JSON 数据,却忘了加 @ResponseBody,或者没有正确配置视图解析器,就可能导致返回的是页面路径字符串而非预期的 JSON 内容,甚至引发错误。

反之,一旦使用了 @RestController,视图解析器就不再起作用了。方法返回的内容会直接作为 HTTP 响应体发送出去。例如,原本应该跳转到 success.jsp 的逻辑,现在只会返回 success 这个字符串本身。

下面是一个典型的控制器示例,展示了如何使用 @RestController 处理业务逻辑并返回统一结果:

@RestController
@RequestMapping("/seckill")
@CrossOrigin(allowCredentials = "true", allowedHeaders = "*")
public class WareController {

    @Autowired
    private WareService wareService;

    @PostMapping("/createitem")
    public CommonResult addWare(@Valid WareModel wareModel, BindingResult bindingResult) throws ProcessException {
        // 校验参数是否有误,如有错误则抛出自定义异常
        if (bindingResult.hasErrors()) {
            String errorMsg = BindingResultUtil.getErrorFromBingdingResult(bindingResult);
            throw new ProcessException(ProcessErrorEnum.INVALID_PARAMETER, errorMsg);
        }

        // 调用服务层添加商品
        wareService.insertWare(wareModel);
        return CommonResult.create(null, );
    }
}
"success"

在实际开发中,如果需要返回指定页面,建议配合 @Controller 使用;如果需要构建 RESTful API 返回 JSON、XML 或自定义媒体类型,那么 @RestController 是更合适的选择。当然,你也可以在单个方法上单独标注 @ResponseBody 来实现局部覆盖。

目录

  1. Spring 中 @Controller 与 @RestController 的区别详解

更多推荐文章

查看全部
  • AIGC 时代如何利用 DeepSeek 辅助编程学习
  • Python 标准库与第三方库实战:日期处理与 Excel 操作
  • 基于 Haystack 与 Bright Data MCP 的自动化爬虫实践
  • C++ 多态概念、实现及原理详解
  • Kubernetes 集群从零部署图文教程
  • C++ 拷贝构造函数与赋值运算符:深拷贝与浅拷贝辨析
  • AI 绘画用户评价自动分类与改进报告生成
  • Qwen3-Embedding-4B 基于 llama.cpp 的集成部署教程
  • 大语言模型架构解析:稀疏门控混合专家(MoE)模型
  • Spring Boot 消息队列与异步处理实战
  • 深度强化学习在足式机器人中的应用(七):从仿真到现实部署实践
  • Python 处理 JSON 如何保持字段顺序?底层机制解析
  • 智谱清言(ChatGLM)大模型应用与功能详解
  • STL 容器适配器 stack 与 queue 底层模拟及算法实战
  • 基于 Leaflet Trackplayer 的高速公路轨迹 WebGIS 可视化实战
  • ClawdBot (OpenClaw) 结合 Discord 机器人部署与配置指南
  • Android 互联网大厂社招指南与核心面试题解析
  • DeepSeek 使用指南:提示词技巧与知识库搭建
  • Deer-flow:字节跳动开源的高性能轻量级 C++ 工作流引擎
  • OpenDroneMap 无人机影像三维重建:安装与实战指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online