Spring Boot中RestController端点无法识别导致404错误的问题求助
看起来你的包结构确实符合Spring Boot自动扫描的要求,但还是有几个常见的点可能导致控制器没被识别,我给你梳理下排查步骤:
1. 先看启动日志,确认控制器是否被注册
启动项目时,仔细看控制台日志,搜索有没有类似这样的输出:
Mapped "{[/custom],methods=[GET]}" onto public org.springframework.http.ResponseEntity<java.lang.Void> com.myproject.controller.CustomPathController.test()
如果完全找不到这条日志,说明你的CustomPathController根本没被Spring扫描到,那就要重点排查组件扫描的问题;如果有这条日志,那问题出在请求路径或者拦截环节。
2. 检查Web依赖是否完整
Spring Boot的Web控制器需要依赖spring-boot-starter-web才能生效,确认你的构建文件(pom.xml或build.gradle)里已经引入了这个依赖:
Maven示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Gradle示例:
implementation 'org.springframework.boot:spring-boot-starter-web'
如果没加这个依赖,Web相关的注解(比如@RestController、@GetMapping)都不会被Spring处理,自然不会生成端点映射。
3. 确认组件扫描范围是否正确
虽然@SpringBootApplication默认会扫描启动类所在包(com.myproject)及其所有子包,但如果你的项目里有其他自定义的@ComponentScan注解(比如在其他配置类上),可能会覆盖默认的扫描范围。
检查所有配置类,确保@ComponentScan的basePackages包含了com.myproject.controller,比如:
@ComponentScan(basePackages = {"com.myproject", "com.myproject.controller"})
如果没有自定义的@ComponentScan,这一步可以跳过,但如果有,一定要保证范围覆盖到控制器所在包。
4. 检查请求路径是否正确
确认你访问的路径是否和控制器配置一致:
- 如果项目没有设置上下文路径,访问地址应该是
http://localhost:你的端口/custom - 如果
application.properties或application.yml里设置了server.servlet.context-path=/xxx,那访问地址要改成http://localhost:你的端口/xxx/custom
另外,检查端口是否正确,默认是8080,如果你改了端口,要对应上。
5. 排查拦截器/过滤器是否拦截了请求
如果项目里有自定义的Filter或Interceptor,检查它们的路径匹配规则,是否把/custom路径的请求拦截了。比如有些Filter会设置url-pattern=/*,但没有放行特定路径,导致请求还没到控制器就被拦截了。
可以暂时注释掉自定义的拦截器/过滤器,再测试请求是否能正常访问,来排查这个问题。
额外小技巧
如果以上步骤都没解决,你可以尝试在CustomPathController类上额外加上@Component注解(虽然@RestController已经包含了@Component,但偶尔会有特殊情况导致注解没被识别),然后重启项目试试。
内容的提问来源于stack exchange,提问作者Callum

