当前位置: 首页 > news >正文

Spring Boot 中 @Controller与 @RestController的区别及 404 错误解析

在开发 Spring Boot 应用时,经常会遇到一个问题:明明写了接口方法,但访问时却返回:

{"timestamp": "2025-08-24 11:28:59","status": 404,"error": "Not Found","message": "No message available","path": "/api/keyword/"
}

很多初学者会以为是路径错了,其实很多情况下是 注解类型使用不当 导致的。本文就结合一个关键字查询接口示例,来分析原因和解决方案。


1️⃣ 问题复现

假设你写了一个 Controller:

@Controller
@RequestMapping("/api/keyword")
public class KeywordController {@GetMapping("/{id}")public Result<Keyword> getById(@PathVariable int id) {return keywordService.getKeywordById(id);}@GetMappingpublic Result<List<Keyword>> getAll() {return keywordService.getAll();}
}

前端请求:

GET /api/keyword/

结果报 404 错误。


2️⃣ 原因分析

  1. @Controller 是传统的 MVC 控制器 注解,用于返回 视图(HTML、JSP、Thymeleaf 页面等)。

  2. 当你在方法中直接返回对象(如 Result<Keyword>)时,@Controller 并不会自动将对象序列化为 JSON。

  3. 访问 /api/keyword/ 时:

    • Spring 尝试解析返回值,找对应的视图模板(比如 Result<Keyword> 对应的页面)
    • 找不到对应模板 → 返回 404(No message available)

所以问题是 返回类型无法被处理


3️⃣ 解决方案

方案 1:使用 @ResponseBody

在每个方法上加 @ResponseBody

@Controller
@RequestMapping("/api/keyword")
public class KeywordController {@GetMapping("/{id}")@ResponseBodypublic Result<Keyword> getById(@PathVariable int id) {return keywordService.getKeywordById(id);}@GetMapping@ResponseBodypublic Result<List<Keyword>> getAll() {return keywordService.getAll();}
}
  • @ResponseBody 告诉 Spring 将返回值序列化为 JSON,而不是去找视图模板。

方案 2:直接使用 @RestController(推荐)

@RestController
@RequestMapping("/api/keyword")
public class KeywordController {@GetMapping("/{id}")public Result<Keyword> getById(@PathVariable int id) {return keywordService.getKeywordById(id);}@GetMappingpublic Result<List<Keyword>> getAll() {return keywordService.getAll();}
}
  • @RestController = @Controller + @ResponseBody,自动处理返回值为 JSON。
  • 更适合做 RESTful 接口,不需要返回视图页面。
  • 前端直接请求 /api/keyword/api/keyword/1 就不会再报 404。

4️⃣ 总结

注解功能使用场景
@ControllerMVC 控制器,返回视图页面渲染(HTML、Thymeleaf、JSP)
@RestControllerREST 控制器,返回 JSON接口服务(REST API)

关键点:

  • 如果返回对象而不是页面,必须让 Spring 知道要序列化@ResponseBody@RestController
  • 避免误用 @Controller 返回 JSON,否则会出现 404(找不到视图)

5️⃣ 建议

  1. 对于 纯后端接口(返回 JSON 数据),统一用 @RestController,代码简洁。
  2. 对于 传统 MVC 页面,使用 @Controller + 模板引擎(Thymeleaf/JSP)。
  3. 避免前端请求路径和控制器映射不一致,尤其注意 / 和空路径。
  4. 如果接口返回对象,请确认返回值已经被序列化,否则会出现类似 404 的错误。
http://www.xdnf.cn/news/1356823.html

相关文章:

  • 工作记录 2015-08-31
  • 【科研绘图系列】R语言浮游植物初级生产力与光照强度的关系
  • leetcode_189 轮转数组
  • 【LLIE专题】一种用于低光图像增强的空间自适应光照引导 Transformer(SAIGFormer)框架
  • Ansible 自动化基石:变量定义、优先级控制与 Vault 敏感信息加密实战指南
  • 【重学MySQL】八十七. 触发器管理全攻略:SHOW TRIGGERS与DROP TRIGGER实战详解
  • MySQL管理
  • [身份验证脚手架] 认证路由 | 认证后端控制器与请求
  • MR椎间盘和腰椎分割项目:基于深度学习的医学图像分析
  • 【数据结构】栈和队列——栈
  • MyBatis 和 MyBatis-Plus对比
  • 一个奇怪的问题-Python会替代Java吗?技术语言之争的真相-优雅草卓伊凡
  • 深度学习:CUDA、PyTorch下载安装
  • 用 Bright Data MCP Server 构建实时数据驱动的 AI 情报系统:从市场调研到技术追踪的自动化实战
  • 自由学习记录(87)
  • System.IO.Pipelines 与“零拷贝”:在 .NET 打造高吞吐二进制 RPC
  • 关于 svn无法查看下拉日志提示“要离线”和根目录看日志“no data” 的解决方法
  • 编译Marlin 1.1.9.1固件指南
  • 如何理解“向量”
  • 大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究
  • 数据挖掘 4.1~4.7 机器学习性能评估参数
  • 【软考架构】云计算相关概念
  • 《CF1120D Power Tree》
  • Implementing Redis in C++ : E(AVL树详解)
  • 深入解析Apache Kafka的核心概念:构建高吞吐分布式流处理平台
  • 自动化运维之k8s——Kubernetes集群部署、pod、service微服务、kubernetes网络通信
  • Linux-函数的使用-编写监控脚本
  • Qt——网络通信(UDP/TCP/HTTP)
  • Linux学习-TCP网络协议
  • Linux shell脚本数值计算与条件执行