为什么Postman调用Spring Boot REST API返回404无法访问?
问题根因
- 组件扫描范围不匹配:Spring Boot 的
@SpringBootApplication注解默认仅扫描启动类所在包(halloween.contest)及其子包下的Bean,你的控制器类位于独立的controllers包下,不在默认扫描范围内,因此接口未被Spring注册,请求返回404。你给出的启动日志中没有出现/tester接口的映射记录,也佐证了该问题。 - 额外的跨域问题:你最初对接Angular遇到的CORS问题,待接口修复后可通过Spring提供的跨域注解快速解决。
解决方案
修复404问题(二选一即可)
- 方案一:调整包结构
将Handler控制器类移动到halloween.contest包或其子包下(例如新建halloween.contest.controllers包存放控制器),启动类即可自动扫描到控制器完成接口注册。 - 方案二:显式指定扫描范围
不修改现有包结构,在启动类上添加@ComponentScan注解手动指定需要扫描的包路径,修改后启动类代码如下:package halloween.contest; import org.springframework.context.annotation.ComponentScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class}) @ComponentScan(basePackages = {"halloween.contest", "controllers"}) public class ContestApplication { public static void main(String[] args) { SpringApplication.run(ContestApplication.class, args); } }
修复CORS问题(对接Angular前配置)
在控制器类上添加@CrossOrigin注解开启跨域支持,开发阶段可临时允许所有来源,生产环境替换为你的Angular应用实际部署地址即可:
package controllers; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @RestController @CrossOrigin(origins = "*") public class Handler { @PostMapping("/tester/{id}") public String tester(@PathVariable(value="id")long userid ){ System.out.println("in tester"); System.out.println(userid); return "succeeded test"; } }
验证方式
修改完成后重启项目,执行curl命令curl --location --request POST 'localhost:8080/tester/69',返回succeeded test则说明接口正常。
内容的提问来源于stack exchange,提问作者JDoe3898
相关产品推荐
相关产品推荐

