代码之家  ›  专栏  ›  技术社区  ›  samanime

排序多个RouterFunctions

  •  0
  • samanime  · 技术社区  · 6 年前

    RouterFunctions 我注册为bean(每段代码一个)。

    /** 用于React的动态路由。基本上,如果没有其他路线匹配,我希望它去那条。

    /** 将阻止另一个终结点。

    有没有办法订单独的 或者一个更好的方法来处理所有不匹配的东西去一个特定的路线?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Brian Clozel    6 年前

    Spring WebFlux正在收集所有RouterFunction bean,并使用 RouterFunction::andOther (见 RouterFunctionMapping

    所以你可以点你的 RouterFunction 豆子作为普通豆子和Spring WebFlux将做剩下的事情。

    @Bean
    @Order(1)
    public RouterFunction first() {
      //
    }
    
    @Bean
    @Order(2)
    public RouterFunction second() {
      //
    }
    
    @Bean
    @Order(3)
    public RouterFunction third() {
      //
    }
    
        2
  •  0
  •   samanime    6 年前

    我已经想出了一个解决办法 RouterFunction 有一个 add() 功能将它们组合在一起。

    路由器功能 像这样的豆子:

    @Configuration
    class MyRouter {
      @Bean
      fun myRoutes(myHandler: MyHandler): RouterFunction<ServerResponse>
        = router {
          GET("/path", myHandler::handlePath)
        }
    }
    

    /** ),哪个是问号。

    我决定把这些合并成一个 在那里我可以控制秩序。因为我不想在某个地方手工管理它们(例如,如果我创建了一个新的路由器类,我只想让它自动获取)。

    首先,我不得不让我的正常路线不再是豆子。我还需要一个简单的方法让Spring找到它们,所以我决定创建一个 abstract class

    看起来是这样的:

    abstract class RouterConfig {
      open val priority: Int = 0 // higher number, later in list
    
      open val routes: RouterFunction<ServerResponse>
        get() = TODO()
    }
    

    这个 priority

    在那之后,我把路由器类改为 Components

    @Configuration
      class MyRouter(
        private val myHandler: MyHandler
      ) {
        override val routes: RouterFunction<ServerResponse>
          get() = router {
            GET("/path", myHandler::handlePath)
          }
    }
    

    最后,我创建了一个新的类和bean,它将收集所有的类和bean:

    @Configuration
    class AppRouter {
      @Bean
      fun appRoutes(routerConfigs: List<RouterConfig>): RouterFunction<ServerResponse>
        = routerConfigs.sortedBy { it.priority }
          .map { it.routes }
          .reduce { r, c -> r.add(c) }
    }
    

    这似乎起到了作用。现在将按优先级顺序添加路由,因此对于可能有点贪婪的路由( /** 100 让它最后出现。