yu-tarrrrの日記

完全に個人の趣味でその時々書きたいことを書く

Spring MVC × KotlinでRouter functionを実装する

はじめに

  • 今回はSpring5.2からMVCでも使えるようになったRouter functionモデルでAPIを実装します

そもそもRouter functionモデルとは?

  • もともとはSpring5.0でWeb Fluxが実装されたタイミングで追加されたAPIを実装する方法
  • 従来は@Controllerなどのアノテーションをつけて実装する、通称アノテーションモデルというもの
  • Web FluxはアノテーションモデルでもRouter functionモデルでも実装できたのですが、Spring Webはアノテーションモデルでしかこれまで実装できませんでした
  • しかし、今回のリリースからRouter functionモデルで実装できるようになったので試してみます

因みに

  • WebFluxでの実装はQiiitaに投稿してあるので、そちらをご確認ください qiita.com

用意したもの

  • OpenJdk 11
  • Kotlin 1.3.61
  • Spring Boot 2.2.2

書いてみる

  • 基本的にはWebFluxの実装方法と同じです
  • 返り値の型は省略しています
@Configuration
class SimpleRoute {

    @Bean
    fun routes() = RouterFunctions.route(
            RequestPredicates.GET("/hoge"), HandlerFunction {
        ServerResponse.ok().body("Hello World")
    })
}
  • 今現在の実装ですと、トップレベルでfunctionを定義した場合、pathが登録されず404になってしまうので、Component Scanの対象のクラスの中で実装してあげましょう
@Configuration
class SimpleRoute {

    @Bean
    fun routes() = RouterFunctions.route(
            RequestPredicates.GET("/hoge/{name}"), HandlerFunction {
        ServerResponse.ok().body("Hello${it.pathVariable("name")}")
    })
}
  • ちなみに、こんな感じでパスパラメータは抜き取れます。
@Configuration
class SimpleRoute {

    @Bean
    fun routes() = RouterFunctions.route(
            RequestPredicates.GET("/hoge"), HandlerFunction { it ->
        it.params().flatMap { it.value }.forEach(::println)
        ServerResponse.ok().body("Hello")
    })
}
  • リクエストパラメータの場合はflatMapで回せば取れそうです

まとめ

  • まだあまり試せてないので、触りの部分だけの紹介となりますが、また調べたら記事にしたいと思います。