当前位置: 首页 > 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.dtcms.com/a/348203.html

相关文章:

  • 【嵌入式汇编基础】-数据处理指令(二)
  • VSCode+Qt+CMake详细地讲解
  • VSCode无权访问扩展市场
  • QT面试题总结(持续更新)
  • Java的IO流和IO流的Buffer包装类
  • Postman参数类型、功能、用途及 后端接口接收详解【接口调试工具】
  • 单链表:数据结构中的高效指针艺术
  • Shell脚本-until应用案例
  • C/C++数据结构之循环链表
  • Dify 部署+deepseek+python调用(win11+dockerdesktop)
  • 大数据、hadoop、爬虫、spark项目开发设计之基于数据挖掘的交通流量分析研究
  • 【运维进阶】case、for、while、until语句大合集
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(十七)设置主题
  • CF757F 题解
  • SO_REUSEADDR
  • RuoYi-Vue3项目中Swagger接口测试404,端口问题解析排查
  • 【力扣】2623. 记忆函数——函数转换
  • 硬件抽象层 (HAL, Hardware Abstraction Layer)的简单使用示例
  • 邮箱创建时间打标与自动删除功能设计思路
  • UML时序图中opt,alt,switch-case的问题
  • 用户和组笔记
  • pion/webrtc v4.1.4 版本发布:关键特性与性能优化全面解析
  • 网络协议UDP、TCP
  • maven私服架构
  • Axure RP 9 交互原型设计(Mac 中文)
  • 【实习总结】快速上手Git:关键命令整理
  • 目标检测数据集 第007期-基于yolo标注格式的茶叶病害检测数据集(含免费分享)
  • 深度剖析Spring AI源码(一):蓝图初探,项目结构与设计哲学
  • 【嵌入式开发 Linux 常用命令系列 8 -- git checkout 解冲突详细介绍】
  • 【从零开始学习Redis】如何设计一个秒杀业务