カテゴリ: Spring 更新日: 2026/01/28

Springのバリデーション例外を完全攻略!BindingResultとMethodArgumentNotValidExceptionの使い方

バリデーション例外対策:BindingResult/MethodArgumentNotValidExceptionの扱い
バリデーション例外対策:BindingResult/MethodArgumentNotValidExceptionの扱い

先生と生徒の会話形式で理解しよう

生徒

「Spring Bootでバリデーションチェックを使ってるんですが、エラーになったときの扱いがよくわかりません…」

先生

「それは@ValidBindingResult、それからMethodArgumentNotValidExceptionの使い分けを知ると解決できますよ。」

生徒

「それってどう違うんですか?どっちを使えばいいんですか?」

先生

「それでは、バリデーションエラーの基本から、例外処理の仕組みまで順番に見ていきましょう!」

1. Springのバリデーションとは?

1. Springのバリデーションとは?
1. Springのバリデーションとは?

Spring Frameworkでは、入力チェック(バリデーション)を簡単に行うために@Valid@Validatedを使います。これにより、フォームやAPIで受け取ったデータが正しいかどうかを事前に検証することが可能になります。

例えば、名前が空欄でないか、メールアドレスの形式が正しいか、数値が範囲内かなどをアノテーションで定義できます。

2. BindingResultを使ったバリデーション結果の取得方法

2. BindingResultを使ったバリデーション結果の取得方法
2. BindingResultを使ったバリデーション結果の取得方法

BindingResultは、@Validの直後に定義することで、バリデーション結果を自分で受け取り処理できます。つまり、例外として処理される前に、コントローラー内で柔軟にエラーをハンドリングできます。


@PostMapping("/users")
public String createUser(@Valid @RequestBody UserForm form, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "バリデーションエラー:" + bindingResult.getAllErrors().get(0).getDefaultMessage();
    }
    return "登録成功";
}

この方法では、例外を発生させずにバリデーションの判定が可能なので、業務ロジックに応じた細かなレスポンスが作れます。

3. BindingResultを使うときの注意点

3. BindingResultを使うときの注意点
3. BindingResultを使うときの注意点

BindingResultは、必ず@Validの引数の直後に記述する必要があります。順番を間違えると、バリデーション結果を取得できず、MethodArgumentNotValidExceptionがスローされてしまいます。


// OKな順番
public String method(@Valid UserForm form, BindingResult result)

// NGな順番
public String method(BindingResult result, @Valid UserForm form)

Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。

Spring Framework超入門をAmazonで見る

※ Amazon広告リンク

4. MethodArgumentNotValidExceptionの概要と発生タイミング

4. MethodArgumentNotValidExceptionの概要と発生タイミング
4. MethodArgumentNotValidExceptionの概要と発生タイミング

MethodArgumentNotValidExceptionは、@Validが指定された引数に対してバリデーションエラーが発生したときに、Springが自動的にスローする例外です。これは、BindingResultが定義されていない場合に発生します。


@PostMapping("/users")
public String createUser(@Valid @RequestBody UserForm form) {
    // BindingResultがないため、エラー時は例外が発生する
    return "OK";
}

REST APIなどでResponseEntityを返すような構成では、この例外を@ExceptionHandlerで受け取って整形レスポンスを返すパターンがよく使われます。

5. MethodArgumentNotValidExceptionをハンドリングする方法

5. MethodArgumentNotValidExceptionをハンドリングする方法
5. MethodArgumentNotValidExceptionをハンドリングする方法

Springでは、@ControllerAdviceを使って、MethodArgumentNotValidExceptionを一括で処理できます。エラー内容をFieldErrorなどから取り出し、APIクライアントに返すことができます。


@ControllerAdvice
public class ValidationExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidation(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> {
            errors.put(error.getField(), error.getDefaultMessage());
        });
        return ResponseEntity.badRequest().body(errors);
    }
}

これにより、APIのレスポンスをクライアントが扱いやすい形式で返すことができます。

6. バリデーションクラスとエラー定義の実例

6. バリデーションクラスとエラー定義の実例
6. バリデーションクラスとエラー定義の実例

ここでは、バリデーション対象となるDTOクラス(データ受け取り用クラス)の記述例を紹介します。


public class UserForm {

    @NotBlank(message = "名前は必須です")
    private String name;

    @Email(message = "メールアドレスの形式が不正です")
    private String email;

    // ゲッター・セッターを省略
}

このようにアノテーションを指定することで、簡単に入力チェックを行うことができます。

7. フロントエンドと連携するためのレスポンス形式

7. フロントエンドと連携するためのレスポンス形式
7. フロントエンドと連携するためのレスポンス形式

APIのバリデーションエラーをフロントエンドで扱いやすくするには、以下のようなJSON構造で返すのが一般的です。


{
  "name": "名前は必須です",
  "email": "メールアドレスの形式が不正です"
}

この形式にすることで、フィールド単位でのエラー表示や、バリデーションの再実行がしやすくなります。

8. BindingResultとMethodArgumentNotValidExceptionの使い分け

8. BindingResultとMethodArgumentNotValidExceptionの使い分け
8. BindingResultとMethodArgumentNotValidExceptionの使い分け

BindingResultは、HTMLフォームなどの画面で細かく制御したいときに向いています。一方、MethodArgumentNotValidExceptionは、REST APIのようにエラーを共通処理で返したい場合に向いています。

  • 画面処理 → BindingResultでエラーを画面に返す
  • API処理 → ExceptionHandlerで一括処理

これらを場面に応じて使い分けることで、より堅牢な入力バリデーションが実現できます。

カテゴリの一覧へ
新着記事
Springの@annotationアノテーションの使い方を完全ガイド!初心者でもわかるAOPの活用法
JavaのSpringで@PostMappingアノテーションを学ぼう!初心者でもわかるHTTP POSTの処理方法
Springのバリデーション例外を完全攻略!BindingResultとMethodArgumentNotValidExceptionの使い方
Javaの@RestControllerアノテーションの使い方を完全ガイド!初心者でもわかるREST APIの基礎
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Springの@Serviceアノテーションの使い方を徹底解説!初心者でもわかるSpring フレームワーク入門
No.3
Java&Spring記事人気No3
JavaのEnumクラスのordinalメソッドを徹底解説!初心者でもわかる列挙型の順序番号
No.4
Java&Spring記事人気No4
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.5
Java&Spring記事人気No5
Spring Data JPA入門!findAll()やfindBy**()の使い方などデータベース操作の基礎を学ぶ
No.6
Java&Spring記事人気No6
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.7
Java&Spring記事人気No7
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.8
Java&Spring記事人気No8
JavaのArrayListクラスとgetメソッドを完全解説!初心者でもわかるリストの要素取得

💻 作業効率アップに

長時間のコーディングでも疲れにくい♪ 静音ワイヤレスマウス

Logicool Signature M750 を見る

※ Amazon広告リンク