Spring Web API请求正确路径始终返回404状态码问题咨询
你遇到的404问题按优先级从高到低排查以下点即可解决:
第一优先级:检查Spring组件扫描范围
你的CountryController在de.luca.test.controller包下,如果带@SpringBootApplication的启动类不在de.luca.test这个根包路径下,Spring默认不会扫描到这个Controller,所有接口都不会被注册,请求自然返回404。
修复方式二选一:- 把启动类移动到
de.luca.test根包下,这是Spring Boot官方推荐的标准目录结构,无需额外配置就能自动扫描所有子包的组件 - 手动指定扫描包路径,在启动类上修改注解为:
@SpringBootApplication(scanBasePackages = "de.luca.test")
- 把启动类移动到
第二优先级:检查服务上下文路径配置
查看你的application.properties或application.yml配置文件,如果存在server.servlet.context-path配置,比如配置值为/demo,那实际接口的完整路径要加上这个前缀,即http://localhost:8080/demo/api/countries/string,不带前缀访问就会404。第三优先级:确认8080端口运行的是你的目标应用
先停掉当前Spring Boot应用,再向http://localhost:8080/api/countries/string发请求,如果还是返回404而不是连接拒绝,说明8080端口被其他服务占用,你之前请求的根本不是当前编写的Spring应用。第四优先级:排查拦截逻辑
如果以上配置都没问题,检查项目里自定义的Filter、Interceptor、权限校验逻辑,这类组件如果没有放行对应路径,也可能直接返回404状态码,可以在拦截逻辑处加断点调试确认。
另外你的代码里存在一个会导致栈溢出的bug,和404无关但必须修复:getAllCountries()方法内调用了自身this.getAllCountries().size()打日志,这是无限递归,要改成调用service层方法:
// 原错误代码 log.info("Array groeße: " + this.getAllCountries().size()); // 修复后 log.info("Array groeße: " + this.countryService.getAllCountries().size());
验证修复是否生效:启动应用后在启动日志里搜索CountryController相关的映射注册日志,能看到{GET /api/countries/string}相关的映射记录就说明接口注册成功,再发请求即可正常响应。
内容的提问来源于stack exchange,提问作者Caychu

