Spring Boot 2.6.6升级后接口404,移除Component Scan遇依赖问题求助
排查Spring Boot 2.6.6接口404问题的关键点
核心根源:控制器未被Spring容器扫描注册
你移除了Component Scan配置,而Spring Boot默认的组件扫描范围是主应用类(带@SpringBootApplication的类)所在包及其子包。如果你的控制器不在这个范围内,就不会被Spring识别并注册,直接导致接口调用404。具体排查与修复步骤:
修正组件扫描范围
- 要么调整主应用类的位置,让它处于所有需要扫描的包的父包层级;要么显式指定扫描路径,确保覆盖控制器、服务等Bean所在的包:
@SpringBootApplication(scanBasePackages = { "com.your.project.controller", "com.your.project.service", "com.your.project.repository" }) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } - 也可以用
scanBasePackageClasses指定具体类所在的包,更类型安全:@SpringBootApplication(scanBasePackageClasses = {UserController.class, UserServiceImpl.class})
- 要么调整主应用类的位置,让它处于所有需要扫描的包的父包层级;要么显式指定扫描路径,确保覆盖控制器、服务等Bean所在的包:
验证控制器是否被实例化
- 启动应用后,在日志里搜索你的控制器类名,查看是否有类似
Mapped "{/api/user}" onto public ...的映射日志;或者在控制器的构造方法里添加日志输出,确认是否被Spring实例化:@RestController @RequestMapping("/api") public class UserController { public UserController() { System.out.println("UserController已初始化"); } @GetMapping("/user") public String getUserInfo() { return "success"; } } - 如果没有相关日志输出,说明控制器确实未被扫描到。
- 启动应用后,在日志里搜索你的控制器类名,查看是否有类似
检查请求路径是否正确
- 确认控制器类上的
@RequestMapping和方法上的@GetMapping/@PostMapping路径拼接是否准确,比如控制器上是@RequestMapping("/api"),方法是@GetMapping("/info"),完整请求路径应为/api/info,不要漏写或多写斜杠。
- 确认控制器类上的
确认Spring MVC自动配置未被禁用
- 检查
application.properties或application.yml中是否存在spring.mvc.enabled=false的配置,该配置会直接禁用Spring MVC的自动配置,导致接口无法映射。
- 检查
解决最初的UnsatisfiedDependencyException(避免后续问题)
- 当初移除Component Scan是治标不治本的做法,这个异常通常是因为某个Bean依赖的对象未被注册,或者存在循环依赖(Spring Boot 2.6+默认禁止循环依赖)。
- 可以通过给依赖Bean添加
@Lazy注解延迟加载,或者调整Bean的依赖结构来解决循环依赖;如果是依赖的Bean未被扫描,正好通过正确的Component Scan配置覆盖其所在包。
内容的提问来源于stack exchange,提问作者Sharvani
相关产品推荐
相关产品推荐

