はじめに
- 今回は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で回せば取れそうです
まとめ
- まだあまり試せてないので、触りの部分だけの紹介となりますが、また調べたら記事にしたいと思います。