質問: いつもお世話になっています。 ### 実現したいこと SpringBootを使って、WebAPIを提供するシステムを作成しています。 例えば「記事データ(post)」というリソースがあったとして、 記事データ用の1つのRESTコントローラを作成することを考えています。 このとき、RESTコントローラ内に次の2つのAPIを用意したいです。 * 下書き保存 * 公開保存 記事データの保存先テーブルは同一の「記事テーブル」をイメージしています。 (各列にNOTNULL制約がほとんどないイメージ) これを実現するため、コントローラ内で次のようなイメージの入力チェックをしたいと考えています。 ``` /** * 下書き保存するAPI */ @RequestMapping("/post/draft") @入力チェック("下書き用") public ResponseEntity saveDraftPost(@Validated @RequestBody PostData postData) { ... /** * 公開保存するAPI */ @RequestMapping("/post/open") @入力チェック("本番用") public ResponseEntity saveOpenPost(@Validated @RequestBody PostData postData) { ... ``` このような要件を実現するには、どのような実装方法が適しているでしょうか? ### 現在思いついている案 * @NotNull(groups=下書き.class)などとし、@Validatedにgroupsの定義を渡す > > この実現方法が最もスタンダードなのかと思いますが、 > > 下書き用/本番用、以外に入力チェックパターンが増えた時にドメインのアノテーションのメンテナンスが大変そうです。 > > また、下書き用/本番用のチェックの中で、ビジネスロジックが必要になった時に対応できません。 > > > * Spring Validatorを使う > > これをすると、コントローラに対してビジネスロジックも呼び出せる入力チェック処理が書けます。 > > ただし、1コントローラの中で、下書き用/本番用などの入力チェックモードみたいな切り替えを実現する方法がわかりません。 > > > --- ご助力を宜しくお願いします。
回答: 両方の合わせ技が良いと思います。 単純なチェックは、Bean Validationのアノテーションでチェックし、ビジネスロジックはSpring Validatorを使うのが良いと思います。 「下書き用」と「本番用」での切り替えは、Bean Validationはgroupsを指定して行い、Spring Validatorは、validateメソッド内で処理を分けてはどうでしょうか? validateメソッド内で処理を分けるのは、Formクラスで「下書き用」「本番用」を区別できる値を持って(処理によって画面から受け取る値を分ける)、その値で処理を分岐したら良いのかなと思います。