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

Spring Boot 3中通过@Bean注册Controller无法映射端点问题

Spring Boot 3 中通过@Bean注册Controller无法映射端点的原因与解决方法

这不是Spring Boot 3的Bug,而是Spring Framework 6(Spring Boot 3基于此)对Controller请求映射注册逻辑的调整,之前的方式不再默认支持,以下是具体原因和解决办法:

核心原因

在Spring Boot 2(对应Spring Framework 5)中,哪怕是通过@Configuration里的@Bean方法手动注册Controller类,Spring的RequestMappingHandlerMapping依然会自动扫描并处理类中的@RequestMapping系列注解。

但从Spring Framework 6开始,只有被组件扫描(@ComponentScan)覆盖到的@Controller/@RestController类,或者标注了@Component的类,才会被RequestMappingHandlerMapping识别并注册请求映射。单纯通过@Bean注册的Controller类,默认不会触发请求映射的检测。

解决办法

方法一:给目标Controller添加@Component注解

直接在CampaignController类上加上@Component,这样即使通过@Bean注册,组件扫描机制也能识别到它,进而让RequestMappingHandlerMapping处理其中的映射注解:

@Component
public class CampaignController {
    @GetMapping("/panel/campaign")
    public ResponseEntity<?> getCampaignInfo() {
        // 业务逻辑实现
        return ResponseEntity.ok("campaign data");
    }
}

方法二:自定义RequestMappingHandlerMapping配置

如果不想给Controller加@Component,可以手动配置RequestMappingHandlerMapping,开启对上下文祖先中Bean的请求映射检测:

@Configuration
public class WebMvcCustomConfig {
    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping() {
        RequestMappingHandlerMapping handlerMapping = new RequestMappingHandlerMapping();
        // 开启检测所有上下文中的Handler方法,包括@Bean注册的Controller
        handlerMapping.setDetectHandlerMethodsInAncestorContexts(true);
        // 保留Spring默认的其他配置
        handlerMapping.setOrder(0);
        return handlerMapping;
    }
}

验证方式

  • 开启org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping的TRACE日志,启动后应该能看到/panel/campaign的映射注册日志
  • 如果项目启用了Spring Boot Actuator,访问/actuator/mappings端点,可直接查看所有已注册的请求映射,确认目标端点是否存在

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:27:23