跟随freeCodeCamp SpringBoot教程,Postman请求返回404而非200
Spring Boot接口返回404问题排查方案
问题概述
按照freeCodeCamp的Spring Boot入门教程开发,Postman请求接口始终返回404状态码(预期200)。已尝试为多包结构添加@ComponentScan注解、核对Postman请求配置、更换电脑重建项目,问题仍未解决。
可能原因
控制器缺失或注解错误
- 未创建标注
@RestController/@Controller的类,或类上注解遗漏 - 控制器所在包未被Spring Boot扫描(即便加了
@ComponentScan,也可能扫描路径配置错误)
- 未创建标注
请求路径不匹配
- 控制器方法的
@RequestMapping/@GetMapping/@PostMapping路径与Postman请求路径不一致(比如大小写、斜杠多/少、路径参数拼写错误) - 项目配置了
server.servlet.context-path,但请求时未带上上下文路径
- 控制器方法的
依赖问题
- 未引入
spring-boot-starter-web依赖,导致Web MVC组件未加载,无法处理HTTP请求 - 依赖版本冲突,引发Web功能异常
- 未引入
启动类位置错误
- 主启动类未放在所有业务包的父包下,自动扫描范围不包含控制器、服务等组件;手动添加的
@ComponentScan路径覆盖了默认扫描范围但未包含必要包
- 主启动类未放在所有业务包的父包下,自动扫描范围不包含控制器、服务等组件;手动添加的
请求方法不匹配
- 控制器定义的是
@PostMapping但用了GET请求,或反之(部分场景下方法不匹配会被返回404而非405)
- 控制器定义的是
解决步骤
1. 检查控制器代码
确认存在标注@RestController的控制器类,且方法上的请求映射注解正确。示例:
@RestController @RequestMapping("/api/users") public class UserController { private final UserService userService; // 构造注入(推荐) public UserController(UserService userService) { this.userService = userService; } @GetMapping public List<User> listAllUsers() { return userService.getAllUsers(); } }
2. 验证组件扫描范围
- 若主启动类不在业务包的父包下,需确保
@ComponentScan的basePackages包含所有需要扫描的包:
@SpringBootApplication @ComponentScan(basePackages = {"com.example.controller", "com.example.service", "com.example.repository"}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
- 更简单的方式是将主启动类移到所有业务包的父包下(比如
com.example),Spring Boot会自动扫描所有子包
3. 核对请求配置
- 把控制器注解中的路径原封不动复制到Postman,确保路径完全一致(包括斜杠、大小写)
- 确认Postman的请求方法(GET/POST)与控制器方法的注解完全匹配
- 若配置了
server.servlet.context-path,请求路径需带上该前缀,比如配置为/demo,则请求URL应为http://localhost:8080/demo/api/users
4. 检查依赖配置
- 确认
pom.xml(Maven)或build.gradle(Gradle)中包含spring-boot-starter-web依赖:
Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-web'
- 执行清理构建命令(Maven:
mvn clean install;Gradle:./gradlew clean build),确保依赖下载完整无损坏
5. 分析启动日志
- 查看项目启动日志,确认是否存在
Mapped "{[/api/users],methods=[GET]}"这类映射成功的日志 - 若没有映射日志,说明控制器未被扫描到,重新检查扫描范围或控制器注解
6. 调试请求
- 在控制器方法中添加日志或断点,确认请求是否到达控制器
- 用浏览器直接访问GET请求路径,排除Postman自身配置问题(比如Headers设置错误)
内容的提问来源于stack exchange,提问作者gpnrunxm
相关产品推荐
相关产品推荐

