Spring Boot应用部署Tomcat出现404 Not Found问题求助
看起来你遇到的是典型的Spring Boot Controller未被正确扫描的问题——Tomcat启动正常,但请求完全找不到对应的处理方法,连Controller里的日志都没输出,说明这个Controller实例根本没被Spring上下文初始化。我给你整理几个最关键的排查步骤,按顺序来应该能定位问题:
1. 先确认@SpringBootApplication的包扫描范围
Spring Boot默认会自动扫描**@SpringBootApplication所在包及其所有子包**里的Bean。你的Application类在app包下,那得看你的CharacterController是不是在app的子包(比如app.controller)里:
- 如果Controller在
app同级的独立包(比如直接叫controller),那必须手动指定扫描范围,比如:@SpringBootApplication(scanBasePackages = {"app", "controller"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } - 或者用
scanBasePackageClasses更精准地指定要扫描的类:@SpringBootApplication(scanBasePackageClasses = {Application.class, CharacterController.class})
2. 检查Controller的注解是否完全正确
别小看这个,很多时候都是细节错了:
- 确保Controller类上标注了
@RestController(REST接口专用,自带@Controller + @ResponseBody),如果只标了@Controller,那方法上必须加@ResponseBody才能返回JSON/文本,否则会去查找视图,自然返回404。 - 检查方法上的请求映射注解(
@GetMapping/@PostMapping/@RequestMapping)的路径是否和你请求的URL完全匹配,比如你写的是@GetMapping("/characters"),那请求必须是http://localhost:8080/characters,别多写或少写斜杠,也别搞混了大小写。
3. 验证pom.xml的依赖是否完整
构建REST应用必须确保引入了spring-boot-starter-web依赖,它包含了Spring MVC和内嵌Tomcat的所有必要组件:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
如果之前手动引入了Tomcat的独立依赖,反而可能和Spring Boot的内嵌Tomcat冲突,建议删掉手动添加的Tomcat依赖,让starter-web自动管理。
4. 查看控制台的Bean注册日志
开启DEBUG级别的日志,就能清楚看到Spring有没有初始化你的CharacterController:
- 在
application.properties里添加:logging.level.org.springframework=DEBUG - 重启应用后,搜索你的Controller类名(比如
CharacterController),如果找不到任何关于这个类的Bean注册日志,那肯定是扫描范围的问题;如果能找到,再看请求映射的路径是否正确。
5. 检查是否有其他配置类干扰扫描
比如你的DatabaseConfig类,如果上面加了@ComponentScan注解,可能会覆盖@SpringBootApplication自带的扫描配置。记住:@SpringBootApplication已经包含了@ComponentScan、@Configuration和@EnableAutoConfiguration三个注解,不需要在其他配置类上重复加@ComponentScan,除非你明确要自定义扫描规则。
6. 确认启动方式正确
必须通过Spring Boot的启动类(Application类的main方法)来启动应用,而不是直接用Tomcat插件或者外部Tomcat容器启动。只有通过SpringApplication.run启动,Spring才会正确初始化上下文,扫描所有指定的Bean。
按照这个顺序排查,大概率能找到问题所在——毕竟这种404但Tomcat正常的情况,90%以上都是包扫描范围不对或者注解配置遗漏。
内容的提问来源于stack exchange,提问作者Asalas77

