Spring Boot3 Kotlin函数式Bean定义下@RequestMapping路由404问题
Spring Boot 3升级后@RequestMapping注解类+函数式Bean注册导致404的问题
问题原因
Spring Boot 3(基于Spring Framework 6)收紧了注解驱动控制器的识别规则:只有被标记为@Controller/@RestController这类控制器 stereotype 注解的Bean,或者实现了Controller接口的Bean,才会被RequestMappingHandlerMapping(处理注解式路由的核心组件)检测并注册为请求处理器。
在Spring Boot 2.7中存在兼容逻辑,即便未标记控制器注解,只要类带有@RequestMapping且注册为Bean,就会被识别为控制器;但Spring 6移除了这一兼容,导致仅通过bean { SimpleRoutes() }注册的@RequestMapping类无法被识别为请求处理器,从而返回404。
而WebFlux的coRouter属于函数式路由模型,和注解驱动模型的注册机制完全独立,因此不受此规则影响,仍能正常工作。
解决方案
方案1:为路由类添加控制器注解(推荐)
直接给SimpleRoutes类添加@RestController(或@Controller,适用于返回视图的场景)注解,明确标记其为控制器Bean。这样即使通过函数式方式注册,Spring也会识别它的角色并注册路由:
@RestController @RequestMapping("/hello") class SimpleRoutes() { @GetMapping() fun helloWorld(): String { return "Hello, World!" } }
注册Bean的代码保持不变:
bean { SimpleRoutes() }
方案2:手动标记Bean为控制器(不推荐,仅作临时兼容)
如果无法添加控制器注解,可以在函数式Bean定义时,手动给BeanDefinition添加控制器属性,强制Spring将其识别为控制器:
bean<SimpleRoutes> { definition -> // 手动设置控制器 stereotype 属性 definition.beanDefinition.setAttribute("org.springframework.stereotype.Controller", true) SimpleRoutes() }
这种方式属于hack式兼容,不符合Spring的规范设计,不建议长期使用。
内容的提问来源于stack exchange,提问作者Kevin B
相关产品推荐
相关产品推荐

