Spring WebFluxをRouter FunctionsとKotlinで書く

会社ではSpring FrameworkとJava8を使ってサービスを書いていますが、趣味としては最新のSpring Framework 5をSpring Boot 2から使ってみることにしました。
その中でノンブロッキング処理の利用に関して、C#でのReactive Extensionsでなじみがあったような構文を見つけたので、これまた新しく出てきたWebFluxとRouter Functionsも一緒にKotlinで書いてみました。WebFluxは、Reactorと呼ばれるオブサーバパターンを使ったPush型コレクションを利用したリクエストの仕組みです。今まで通りControllerを使うこともできます。

プロジェクト全体のソースコードはこちらから。ちょっとだけKotlinでDSLを加えています。

まず、Spring InitializrでKotlin、Spring Boot 2.0.0 M4を選び、DependencyにはReactive Web(WebFlux)を追加します。
続いて、いつも通りに@SpringBootApplicationを使って起動用クラスを作ります。Controllerを使う今までからあった方法とはちょっと変わり、そのクラスの中にBeanroutes:RouterFunction<ServerResponse>定義しています。ここでRouterをそのまま返したり、Router同士を繋げて返すなどし、ルーティングの設定を行います。(ちなみにRouterインターフェースは公式にはなく、自分で定義しています。参考記事でもそうなっていません。こうした理由としては、私はRouterが増えたときに引数を増やすのが面倒に感じたからです。)

ハンドラ(FooHandlerBarHandler)については、routerというKotlin DSLをデフォルトで利用することもできます。Kotlinサポートもしっかりしているようで楽しく書いていけそうですね。
他には特筆することはないですが、関数を渡すのではなくラムダ内で実行させるほうが短く書けてしまうのはちょっと複雑な気持ちになります。

最後に単体テストです。WebFluxにおいてはWebTestClientを利用するのが王道のようです。lateinitを駆使して事前処理を書きます。valにできないのがちょっと気がかり。
Securityなどを使った場合はテストのパラメタの指定がもっと複雑なようですが、このサンプルはシンプルな構造なので、比較的楽だと思われます。

ちょこちょこ自作DSLを入れていますが、この辺はもうちょっとライブラリ側(とKotlinの型システム)に改善の余地がありそうですね。


参考記事