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
相关产品推荐
相关产品推荐

