You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot嵌套@RestController请求映射失效,返回404求助

问题分析与解决方案

一、API路径继承拼接不生效的核心原因

Spring MVC的@RequestMapping(包括@RestController类上的路径注解)不会自动继承并拼接父类的路径前缀。你当前的写法里,子类的路径注解是独立的,不会和父类的路径合并:

  • 比如RootAPIController的@RequestMapping("/api"),RootV1Controller的@RequestMapping("/v1")不会自动拼成/api/v1,而是单独作为/v1前缀,导致CardController的实际路径是/v1/card/all,完全不符合你期望的/api/v1/card/all。

解决路径拼接问题的两种方法

  1. 显式拼接路径前缀
    直接在子类的@RequestMapping里包含父类的路径,这种方式简单直接,不容易出错:

    @RestController
    @RequestMapping("/api")
    public class RootAPIController {}
    
    @RestController
    @RequestMapping("/api/v1")
    public class RootV1Controller extends RootAPIController {}
    
    @RestController
    @RequestMapping("/api/v1/card")
    public class CardController extends RootV1Controller {
        @GetMapping("/all")
        public List<Card> getAllCards() {
            // 业务逻辑实现
        }
    }
    
  2. 全局配置API前缀
    如果想统一管理所有API的根前缀,可以在配置类里设置全局路径前缀,比如:

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void configurePathMatch(PathMatchConfigurer configurer) {
            configurer.addPathPrefix("/api", c -> c.isAnnotationPresent(RestController.class));
        }
    }
    

    这样所有@RestController的路径都会自动加上/api前缀,之后子类只需要配置/v1、/card即可,最终路径会自动拼接成/api/v1/card/all。

二、外部包类无法被扫描的原因与解决

Spring Boot默认只扫描启动类BackendServiceApplication所在主包及其子包下的组件(包括控制器、服务类等)。如果你的控制器在外部包,Spring根本找不到这些类,自然不会注册对应的端点,访问就会返回404。

解决包扫描问题的方法

  1. 修改启动类的扫描范围
    在@SpringBootApplication注解里用scanBasePackages指定所有需要扫描的包:

    @SpringBootApplication(scanBasePackages = {"com.your.main.package", "com.external.api.package"})
    public class BackendServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(BackendServiceApplication.class, args);
        }
    }
    

    把你的主包和外部API包都填进去,多个包用逗号分隔。

  2. 添加@ComponentScan注解
    如果需要更灵活的扫描配置,可以单独加@ComponentScan注解:

    @SpringBootApplication
    @ComponentScan(basePackages = {"com.your.main.package", "com.external.api.package"})
    public class BackendServiceApplication {}
    

三、验证步骤

  1. 启动项目后,查看控制台日志,找类似Mapped "{[/api/v1/card/all],methods=[GET]}"的输出,确认端点是否被正确注册。
  2. 如果日志里没有对应端点,说明控制器没被扫描到,检查包扫描配置的包名是否正确。
  3. 如果端点已注册但还是404,检查请求路径的大小写、斜杠是否和注册的路径完全一致。

内容的提问来源于stack exchange,提问作者trever

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 00:52:50