-- Views
November 16, 25
スライド概要
JJUG CCC 2025 Fall(https://jjug.doorkeeper.jp/events/190868)
Spring Boot で業務アプリを開発する際に欠かせないのが入力値のバリデーションです。
本セッションでは、 Spring Boot のバリデーション機能の基本的な使い方から、カスタムバリデーション、例外処理、エラーメッセージの取り扱いまで、サンプルコードを交えながら解説します。
これから Spring Boot を使い始める方、あるいは「バリデーション定義はしたことあるけど、エラーハンドリングの仕組みは有識者に任せていた」という状態から一歩先に進みたい方に役立つ内容をお届けします。
したっぱプログラマおじさん。一生を Getting Started の実施で過ごす人。
Spring Boot バリデーション実践入門 例外処理からエラーメッセージまで
このスライドについて • 対象者 • 基本的な Spring Boot アプリを作ったことはあるが、バリデーション を体系的に学んでいない人 • Spring Boot プロジェクトの基礎設計をする人 • 目標 • Spring Boot のバリデーションで、「こんなことができるんだ」とい う事を知る
目次 • 基本のバリデーション • カスタムバリデーション • エラーメッセージ定義とi18n • バリデーションエラーの返却
基本のバリデーション 基本は単項目チェック。 アノテーションをつけることにより、どんなバリデーションを行 うか定義する。 • @RequestParam に直接定義 • @RequestBody のバリデーション定義 (Bean のフィールドにバリデーション定義) • デフォルトアノテーションの一例
@RequestParam に直接定義 引数にアノテーションをつける ことでバリデーションを定義 文字数は、 1 から 10 とする 文字、正規表現 “[0-9]*” にマッチする
動作確認(バリデーション成功) 正規表現”[0-9]*”に適合
動作確認(バリデーション失敗) 正規表現”[0-9]*”に不適合 エラーの情報がずらずらと返却される
@RequestBody のバリデーション定義 (Bean のフィールドにバリデーション定義) @RequestBody に @Valid を付与 Bean の各フィールドにバリデーション用 のアノテーションを付与
デフォルトアノテーション jakarta.validation.constraints.AssertFalse jakarta.validation.constraints.AssertTrue jakarta.validation.constraints.DecimalMax jakarta.validation.constraints.DecimalMin jakarta.validation.constraints.Digits jakarta.validation.constraints.Future jakarta.validation.constraints.Max jakarta.validation.constraints.Min jakarta.validation.constraints.NotNull jakarta.validation.constraints.Null jakarta.validation.constraints.Past jakarta.validation.constraints.Pattern jakarta.validation.constraints.Size org.hibernate.validator.constraints.Email org.hibernate.validator.constraints.Length org.hibernate.validator.constraints.NotEmpty org.hibernate.validator.constraints.Range org.hibernate.validator.constraints.URL 何となく名前覚えておけば 大体できることがわかる 使うときに都度都度調べるので あまり覚えなくてよいかも
カスタムバリデーション 基本のバリデーションで足りない場合、ロジックを自分で書くこ とになる。 相関チェックや、単項目チェックでもデフォルトで足りないもの など。 • 相関チェック(クラスレベル制約) • カスタムバリデーターの作成
相関チェック(クラスレベル制約) • AssertTrue アノテーションを使用 することで、相関チェックも可能 isXxx メソッドに `@AssertTrue` を付与し、 バリデーション結果を true/false で返却する
カスタムバリデーターの作成(1/2) • デフォルトで提供されて いるアノテーションでは 不十分な場合、自分でア ノテーションを作ること もできる 0から100までと、255 のみバリデーションOK • 左の例では Range を拡 張し、範囲プラスαの数 値を Valid とするアノ テーションを使っている
カスタムバリデーターの作成(2/2)
カスタムバリデーターの作成(2/2) アノテーションなど、 基本的な構造は Range からコピー 最大値・最小値は Min, Max からオーバーライド 拡張した項目を追加
カスタムバリデーターの作成(2/2) 定義したパラメーターを private フィールドとして保存する
カスタムバリデーターの作成(2/2) 定義したパラメーターと受け取った値を比較し、 バリデーションの結果を返却する
エラーメッセージ定義とi18n エラーメッセージの設定方法は、大きく分けて以下 2 つ。 • 個別指定(アノテーションで指定) • 言語別デフォルト指定
個別指定(アノテーションで指定) `massage` で指定した文字列が、エラーメッセージになる
デフォルト指定 `src/main/resources/ValidationMessages.properties` にデフォルトメッセージ定義を記 述できる。
言語別デフォルト指定 `src/main/resources/ValidationMessages_en.properties` や `src/main/resources/ValidationMessages_ja.properties` 等を 作成することで、言語別のデフォルトメッセージ定義が可能。 出力するメッセージは、リクエストヘッダーの `Locale` ヘッ ダーを見て判断される。
バリデーションエラーの返却 バリデーションエラーは、一元管理するのが楽なので、その方法 を紹介する。 • advice によるバリデーションエラー返却の一元化
advice による バリデーションエラー返却の一元化 • デフォルトではスタックトレースが含まれており、これをよし としない場合が多い • また、バリデーションエラーの構造は全エンドポイントで統一 されていることがほとんど • ⇒ `@RestControllerAdvice` を用いてバリデーションエラー返 却の一元化が可能
全体像 `@RestControllerAdvice` 内に以下の 3 種類のメソッドを追加す ることで、バリデーション関連エラーの一元化が可能
メソッド引数の単純値の バリデーションエラーを処理するハンドラ 引数に直接バリデーション定義をつけたもののバリデーションエ ラー時にここに来る
メソッド引数の bean の バリデーションエラーを処理するハンドラ `@Valid`をつけたもののバリデーションエラー時にここに来る
シンタックスエラーなど、そもそも正しくな いリクエストだった場合に処理するハンドラ
まとめ 今回は、以下の項目が行えることを説明してきました。 • 単項目バリデーション • 相関チェックのバリデーション • デフォルトメッセージの設定方法 • 言語別のデフォルトメッセージの設定方法 • バリデーションエラーの効率の良いハンドリング方法 Spring Boot は、効率よく望んだとおりのバリデーションを行うため の仕組みを用意してくれています。 これら機能を活用してどんどん楽をしていきましょう。