Spring Boot中Controller方法未触发,请求返回404错误求助
以下是针对性的排查步骤,按顺序检查:
确认启动类的包扫描范围
你的AppApplication.java作为Spring Boot启动类,默认只会扫描自身所在包及其子包下的组件。如果ProductController.java所在的包不在启动类的包层级内,需要在启动类上显式指定扫描包:@SpringBootApplication(scanBasePackages = "你的根包路径,比如com.bezkoder") public class AppApplication { public static void main(String[] args) { SpringApplication.run(AppApplication.class, args); } }验证控制器的注解配置
检查ProductController.java的注解是否正确:- 必须添加
@RestController注解(如果用@Controller,需要给每个返回数据的方法加@ResponseBody) - 类级别的
@RequestMapping要准确对应/api/v1/product,或者方法级别的路径和类级别组合后匹配目标接口。示例:@RestController @RequestMapping("/api/v1/product") public class ProductController { @GetMapping public List<ProductModel> listAllProducts() { // 业务逻辑 } }
注意路径不要出现前后斜杠不一致的情况,比如控制器路径写
/api/v1/product/(末尾带斜杠),而你访问/api/v1/product会被视为不同路径,可通过配置spring.mvc.pathmatch.matching-strategy=ant_path_matcher消除这种差异。- 必须添加
查看启动日志中的映射记录
启动应用时,日志中会打印所有被Spring加载的控制器映射信息,比如:Mapped "{[/api/v1/product],methods=[GET]}" onto public java.util.List<com.bezkoder.spring.jdbc.model.ProductModel> com.bezkoder.spring.jdbc.controller.ProductController.listAllProducts()
如果找不到这类日志,说明控制器没有被Spring容器识别,回到第一步检查包扫描。核对HTTP请求方法
如果你用GET请求访问,但控制器中对应的方法是@PostMapping(或其他不匹配的请求方法注解),也会返回404。确保请求方法和控制器方法的注解完全匹配。检查上下文路径配置
打开application.properties或application.yml,查看是否设置了server.servlet.context-path。如果有这个配置,比如server.servlet.context-path=/demo,那么实际访问路径应该是/demo/api/v1/product,而非直接访问/api/v1/product。
内容的提问来源于stack exchange,提问作者Chhaya Tiwari

