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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:25:08