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

Spring替换router为coRouter后接口返回404,求正确配置方法

协程版Spring WebFlux路由配置导致404的解决方法

问题背景

原本使用router构建的Spring WebFlux路由可以正常运行:

@Configuration
class RouteConfiguration {

    @Bean
    fun apiRouter(handler: UserHandler): RouterFunction<ServerResponse> {
        return router {
            "/api".nest {
                GET("/users") { ok().bodyValue(handler.getAllUsers()) }
                GET("/users/{id}") {
                    val user: User? = handler.getUserById(it.pathVariable("id").toInt())
                    if (user != null) {
                        ok().bodyValue(user)
                    } else {
                        ok().build()
                    }
                }
                POST("/users") {
                    ok().bodyValue(handler.createUser(it.bodyToMono(User::class.java).block()))
                }
            }
        }
    }
}

改为使用协程版coRouter后,所有接口返回404 NOT FOUND,且IDEA无法识别这些接口:

@Configuration
class RouteConfiguration {

    @Bean
    fun apiRouter(handler: UserHandler): RouterFunction<ServerResponse> {
        return coRouter {
            "/api".nest {
                GET("/users") { ok().bodyAndAwait(handler.getAllUsers()) }
                GET("/users/{id}") {
                    val user: User? = handler.getUserById(it.pathVariable("id").toInt())
                    if (user != null) {
                        ok().bodyValueAndAwait(user)
                    } else {
                        ok().buildAndAwait()
                    }
                }
                POST("/users") {
                    ok().bodyValueAndAwait(handler.createUser(it.bodyToMono(User::class.java).awaitSingle()))
                }
            }
        }
    }
}

解决步骤

  • 确认协程依赖正确性
    确保项目已引入Spring WebFlux的协程支持依赖,Gradle示例:

    implementation("org.springframework.boot:spring-boot-starter-webflux")
    

    Spring Boot 3+版本已默认集成协程支持,需保证Kotlin版本不低于1.8。

  • 修正路由Bean的返回类型
    coRouter构建的是CoRouterFunction<ServerResponse>,虽然它继承自RouterFunction,但显式声明返回类型能避免Spring上下文识别问题:

    @Bean
    fun apiRouter(handler: UserHandler): CoRouterFunction<ServerResponse> {
        return coRouter {
            // 路由配置逻辑
        }
    }
    
  • 检查协程相关导入
    确保导入正确的coRouter扩展方法,正确导入路径为:

    import org.springframework.web.reactive.function.server.coRouter
    

    避免IDEA自动导入错误的包导致路由无法注册。

  • 优化请求处理的协程调用
    使用Spring WebFlux提供的协程扩展简化代码,同时保证调用合规:

    • POST请求中,替换bodyToMono().awaitSingle()为更简洁的awaitBody():
      POST("/users") {
          val user = it.awaitBody<User>()
          ok().bodyValueAndAwait(handler.createUser(user))
      }
      
    • 确保getAllUsers()、getUserById()、createUser()等方法如果是协程调用,需标记为suspend函数。
  • 验证配置类的扫描范围
    确认@Configuration注解的配置类处于Spring Boot的组件扫描路径下(主类所在包或其子包),否则路由Bean无法被加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:16:06