カテゴリ: Spring 更新日: 2025/12/22

Javaの@Validアノテーションを徹底解説!初心者でもわかる入力値検証の基本

Springの@Validアノテーション
Springの@Validアノテーション

教材紹介 Spring Boot 学習のおすすめ教材

Spring Bootを使ったWebアプリケーション開発を、 環境構築から実践まで一通り学びたい方には、 定評のある入門書が参考になります。

Spring Boot 3 プログラミング入門をAmazonで見る

※ Amazon広告リンク

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

生徒

「Javaで、フォームの入力値が正しいかどうかを検証する方法ってありますか?」

先生

「はい、@Validアノテーションを使うと、入力値が正しいかどうかを自動的に検証できます。これは、バリデーションの強力なツールです。」

生徒

「それは便利ですね!でも、具体的にはどう使うんですか?」

先生

「それでは、@Validアノテーションを使った基本的な使い方を見ていきましょう!」

1. @Validアノテーションとは?

1. @Validアノテーションとは?
1. @Validアノテーションとは?

Javaの@Validアノテーションは、フォームの入力値を検証するためのものです。このアノテーションを使うことで、指定したクラスやオブジェクトが持っているプロパティ(フィールド)に対して、バリデーション(検証)を行うことができます。
@Validは、Spring Frameworkの一部として使われることが多く、特にフォームから送信されたデータが正しいかどうかをチェックする際に非常に役立ちます。例えば、ユーザーがフォームに名前やメールアドレスを入力したとき、その値が正しい形式かどうかを自動で検証することができます。

イメージとしては「@Valid=検査を有効化する合図」。検査の具体的な“ルール”は、クラスの各フィールドに付ける@NotBlank@Emailなどの制約アノテーションが担い、@Validがそれらを一括で起動します。これにより、コントローラーで受け取ったオブジェクトが“正しい状態”かどうかを機械的に判断できます。

最小イメージ(まずは雰囲気を掴む)

import jakarta.validation.constraints.*; // Spring Boot 3系の場合
public class UserForm {
    @NotBlank(message = "名前は必須です")
    private String name;

    @Email(message = "メール形式が不正です")
    private String email;
    // getter / setter...
}

上のように“フィールド側”にルールを付けておき、コントローラーのパラメータに@Validを付けると、そのルールがまとめて適用されます(使い方の詳細は後の章で扱います)。まずは「ルール=フィールド、実行=@Valid」の分担だけ覚えておけば十分です。

  • できること: 未入力チェック、書式チェック、文字数・数値範囲などを自動判定
  • よく使う制約: @NotBlank / @Email / @Size / @Min / @Max など
  • 覚え方: @Validで「検査スタート」、結果は後段で取り出して表示やハンドリングに回す

2. @Validアノテーションの基本的な使い方

2. @Validアノテーションの基本的な使い方
2. @Validアノテーションの基本的な使い方

@Validアノテーションは、検証を行いたいオブジェクトの前に付けて使用します。例えば、フォームから送信されたユーザー情報を検証したい場合、以下のように使います。
まず、検証したいクラスに対して、各フィールドにバリデーションアノテーション(例えば@NotNull@Email)を指定します。その後、@Validをコントローラーのメソッドパラメータに付けて、フォームデータのバリデーションを実行します。


import javax.validation.constraints.NotNull;
import javax.validation.constraints.Email;

public class UserForm {

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

    @Email(message = "正しいメールアドレスを入力してください")
    private String email;

    // getter, setter...
}

上記のコードでは、UserFormクラスに@NotNull@Emailアノテーションを使って、それぞれのフィールドを検証しています。
次に、このフォームをコントローラーのメソッドで受け取る際に、@Validを使用して、フォームデータが正しいかをチェックします。


import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;

@Controller
@RequestMapping("/user")
public class UserController {

    @PostMapping("/submit")
    public String submitForm(@Valid @RequestBody UserForm userForm, BindingResult result) {
        if (result.hasErrors()) {
            return "errorPage";  // エラーがあればエラーページに遷移
        }
        return "successPage";  // 入力が正しければ成功ページに遷移
    }
}

上記のコントローラーでは、@Validを使ってUserFormを検証し、BindingResultを使って検証結果を取得しています。もしフォームにエラーがあれば、エラーページに遷移し、エラーがなければ成功ページに遷移します。

3. バリデーションエラーの表示方法

3. バリデーションエラーの表示方法
3. バリデーションエラーの表示方法

@Validを使ってフォームの検証を行った後、エラーが発生した場合、エラーメッセージを表示する方法について説明します。
バリデーションエラーは、BindingResultオブジェクトを使って取得できます。そして、そのエラーメッセージを画面に表示するために、Spring MVCのエラーメッセージ機能を活用します。


<form action="/user/submit" method="post">
    <label for="name">名前:</label>
    <input type="text" id="name" name="name" />
    <div th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></div>

    <label for="email">メールアドレス:</label>
    <input type="text" id="email" name="email" />
    <div th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></div>

    <button type="submit">送信</button>
</form>

上記のコードでは、Thymeleafを使ってバリデーションエラーメッセージを表示しています。th:ifth:errorsを使うことで、該当するフィールドにエラーがあった場合に、そのエラーメッセージを表示することができます。

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

Spring Framework超入門をAmazonで見る

※ Amazon広告リンク

4. @Validの注意点

4. @Validの注意点
4. @Validの注意点

@Validを使う際の注意点として、いくつかのポイントがあります。まず、@Validを使うことで、対象のオブジェクトが持つフィールドに対して自動でバリデーションを行いますが、バリデーションを実行するためにはjavax.validationパッケージが必要です。
また、@Validは単体で使うこともできますが、複雑なバリデーションを実装する際は、@Validatedを使うことも検討してみましょう。
最後に、@Validアノテーションはあくまで「検証」を行うものであり、入力されたデータが本当に有効かどうかを最終的に判断するのはアプリケーションのロジックに委ねられます。

5. @Validatedとの違いとグループバリデーション(Create/Updateで検証ルールを切替)

5. @Validatedとの違いとグループバリデーション(Create/Updateで検証ルールを切替)
5. @Validatedとの違いとグループバリデーション(Create/Updateで検証ルールを切替)

@Validは「すべての制約を実行」するのに対し、@Validatedは「検証グループ」を指定して、場面(新規作成・更新)ごとに制約を切り替えられます。Javaの@Validアノテーション 使い方/入力値検証の基本/Spring Boot バリデーションというSEO観点の主要キーワードにも合致する重要ポイントです。


// 検証グループのマーカーインターフェース
public interface Create {}
public interface Update {}

// DTO(場面ごとに制約を切替)
import javax.validation.constraints.*;
public class AccountForm {
    @NotBlank(groups = {Create.class, Update.class}, message = "ユーザー名は必須です")
    private String username;

    // 新規作成時だけ必須、更新時は任意
    @NotBlank(groups = Create.class, message = "パスワードは新規作成時に必須です")
    private String password;

    // 更新時のみ必須
    @NotBlank(groups = Update.class, message = "表示名は更新時に必須です")
    private String displayName;

    // getter/setter...
}

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/account")
public class AccountController {

    @PostMapping("/create")
    public String create(@Validated(Create.class) @ModelAttribute AccountForm form,
                         BindingResult result) {
        if (result.hasErrors()) return "accountForm";
        return "redirect:/account/created";
    }

    @PostMapping("/update")
    public String update(@Validated(Update.class) @ModelAttribute AccountForm form,
                         BindingResult result) {
        if (result.hasErrors()) return "accountForm";
        return "redirect:/account/updated";
    }
}

メモ:Spring Boot 3 以降は jakarta.validation.* パッケージに変更されています(javax.validation.*と読み替え可)。

6. ネストオブジェクト/コレクションの入れ子検証(@Validのカスケード)

6. ネストオブジェクト/コレクションの入れ子検証(@Validのカスケード)
6. ネストオブジェクト/コレクションの入れ子検証(@Validのカスケード)

フォームが入れ子構造の場合、親フィールドに@Validを付けると、子オブジェクトやコレクション要素まで自動的に再帰検証(カスケード)されます。これにより、住所や明細行など複合入力の入力値検証を簡潔に保てます。


// 子オブジェクト
import javax.validation.constraints.*;
public class Address {
    @NotBlank(message = "都道府県は必須です")
    private String prefecture;

    @NotBlank(message = "市区町村は必須です")
    private String city;

    @Pattern(regexp = "\\d{3}-\\d{4}", message = "郵便番号はXXX-XXXX形式で入力してください")
    private String zip;
    // getter/setter...
}

// コレクション要素
public class Phone {
    @Pattern(regexp = "0\\d{1,4}-\\d{1,4}-\\d{4}", message = "電話番号の形式が正しくありません")
    private String number;
    // getter/setter...
}

// 親フォーム
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

public class ProfileForm {
    @Valid // 子まで検証
    private Address address = new Address();

    @Valid // 要素ごとに検証
    private List<Phone> phones = new ArrayList<>();

    // getter/setter...
}

@PostMapping("/profile/save")
public String saveProfile(@Valid @ModelAttribute ProfileForm form, BindingResult result) {
    if (result.hasErrors()) {
        // address.*, phones[i].* のエラーもここに格納される
        return "profileForm";
    }
    return "redirect:/profile?ok";
}

画面側では th:errors="*{address.zip}"th:eachphones の各要素エラーを表示します。大規模フォームでも一貫した@Valid 使い方で保守性が上がります。

7. メッセージの国際化・カスタムメッセージ(ValidationMessages)

7. メッセージの国際化・カスタムメッセージ(ValidationMessages)
7. メッセージの国際化・カスタムメッセージ(ValidationMessages)

バリデーション文言はハードコードせず、ValidationMessages.properties(多言語は ValidationMessages_ja.properties など)に定義します。Javaの@Validアノテーション メッセージ/エラー表示 カスタマイズというSEOキーワードにも有効です。


// DTO(メッセージキーを参照)
import javax.validation.constraints.*;

public class UserForm {
    @NotBlank(message = "{user.name.required}")
    private String name;

    @Email(message = "{user.email.invalid}")
    private String email;
    // getter/setter...
}

# src/main/resources/ValidationMessages.properties
user.name.required=名前は必須です
user.email.invalid=正しいメールアドレスを入力してください

# 任意(多言語化する場合)
# src/main/resources/ValidationMessages_en.properties
user.name.required=Name is required.
user.email.invalid=Please enter a valid email address.

# (必要に応じて)application.properties
spring.messages.basename=messages,ValidationMessages

Bean Validationはデフォルトで ValidationMessages を参照します。フィールド名の見栄えを変えたい場合は、個別キー化(例:user.name.required)やプレースホルダ({min} など)を活用すると、再利用性と可読性が向上します。

まとめ

まとめ
まとめ

今回は、Javaの@Validアノテーションについて詳しく学びました。@Validを使うことで、フォーム入力値を簡単に検証することができ、エラーがあれば適切なエラーメッセージを表示できます。
これにより、ユーザーが正しい形式でデータを入力しているかどうかを、手間なく確認できるようになります。@Validは、特にSpring Frameworkで使用されることが多く、BindingResultと組み合わせることで、エラー処理を効率的に行うことができます。
バリデーションの種類としては、@NotNull@Emailなどがあり、それぞれのフィールドに適切なバリデーションを設定することができます。また、Thymeleafを使って、エラーメッセージをユーザーにわかりやすく表示することも可能です。

@Validアノテーションはシンプルで便利ですが、複雑なバリデーションや条件付きのバリデーションが必要な場合は、@Validatedを使用することを検討するのも一つの方法です。また、バリデーションの結果がどのようにアプリケーションに影響を与えるかを理解し、最終的なデータ処理はアプリケーション側で適切に行うことが重要です。

先生と生徒の振り返り会話

生徒

@Validアノテーションは、入力値が正しいかどうかをチェックするために便利ですね。でも、エラー処理はどうやって行うんですか?」

先生

「いい質問ですね!@Validアノテーションを使って検証した後、BindingResultを使ってエラー情報を取得し、それを元にエラーメッセージを表示する方法を見てきました。例えば、Thymeleafを使ってエラーメッセージをフォームに表示することができます。」

生徒

「なるほど、エラーメッセージをうまく表示することで、ユーザーに親切なフォームを作ることができるんですね。」

先生

「その通りです!@Validを活用することで、フォームの入力チェックが簡単にでき、ユーザーにとっても使いやすいアプリケーションを作ることができます。」

生徒

@Validatedを使うことで、さらに複雑なバリデーションができるんですね。これからもっといろいろなアノテーションを試してみたいと思います!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaの@Validアノテーションって何のために使うのですか?フォーム入力チェックとどう関係がありますか?

@Validアノテーションは、Javaでフォームの入力値が正しいかどうかを自動でチェックするために使われるバリデーション機能です。Spring Frameworkと組み合わせることで、入力値の整合性を簡単に確認できるため、エラーの少ないWebアプリケーション開発に役立ちます。

Spring Bootで@Validを使うには何をインポートすればいいですか?初心者にも分かりやすく教えてください。

Spring Bootで@Validアノテーションを使うには、javax.validationパッケージの依存関係が必要です。たとえば、Mavenであれば「hibernate-validator」などを追加します。コントローラーでは、@Validと一緒にBindingResultを使うことで、検証結果を取得できます。

Javaのフォーム入力チェックで@Validと@Validatedの違いは何ですか?

@Validは単純なバリデーションに適しています。一方、@Validatedはグループ化など高度な検証機能が必要な場合に使います。@ValidはJava標準のバリデーションですが、@ValidatedはSpring特有のアノテーションです。

@Validを使ってエラーメッセージを表示したいのですが、どうすればよいですか?

@Validでエラーが発生した場合、BindingResultオブジェクトからエラー情報を取得し、Thymeleafなどのテンプレートエンジンを使ってエラーメッセージを表示します。例えば、th:ifやth:errorsを活用することで、対象フィールドごとにメッセージを表示できます。

Javaの@Validと一緒に使う@NotNullや@Emailはどういう意味がありますか?

@NotNullは「値がnullであってはならない」という検証ルールで、@Emailは「メールアドレス形式が正しいかどうか」をチェックするバリデーションです。これらをフィールドに設定することで、@Validと連携して自動検証が行われます。

Spring MVCのフォーム送信で@Validを使うとき、POSTメソッドでどう処理されるのですか?

Spring MVCでは、POSTメソッドで受け取るパラメータに@Validを付けて、フォームデータを自動的に検証できます。検証結果はBindingResultに格納され、エラーがある場合はエラーページへ、なければ次の処理へ進めるように分岐させます。

@Validを使ってもエラーが出ないのですが、何か設定が足りないのでしょうか?

@Validが効かない場合は、バリデーション対象のクラスにアノテーション(@NotNullや@Emailなど)が付いていない、または依存ライブラリ(javax.validationなど)が不足していることが考えられます。設定や依存関係を確認しましょう。

Javaでのフォームバリデーションで、画面に表示するエラーメッセージはどこで設定するのですか?

エラーメッセージは、各バリデーションアノテーションの「message属性」で指定できます。例えば、@NotNull(message = "名前は必須です") のように記述すれば、そのメッセージが画面に表示されます。より柔軟にしたい場合は、プロパティファイルを使って国際化も可能です。

Thymeleafで@Validによるバリデーション結果をどうやって表示するのですか?

Thymeleafでは、フォームフィールドごとにth:ifとth:errorsを使ってバリデーションエラーを表示できます。例えば、「th:if="${#fields.hasErrors('name')}"」のように記述すれば、nameフィールドにエラーがあるときだけメッセージが表示されます。

初心者でも使えるJavaのバリデーションの始め方を教えてください。@Validは難しいですか?

@ValidはJava初心者でも比較的簡単に使えるバリデーション機能です。まずは、フォーム用のクラスに@NotNullや@Emailなどのアノテーションを付けて、コントローラーで@Validを使用するだけで基本的なチェックが可能になります。慣れることで応用もできます。

@Validのバリデーションはネストされたクラスにも使えますか?

はい、ネストされたクラス(例えば、UserFormの中にAddressFormなど)にも@Validアノテーションを使うことで、階層的なバリデーションが可能です。ネストされたフィールドにも適切なバリデーションアノテーションを付ける必要があります。

単体テストでグループバリデーションを再現するにはどうすればよいですか?

Validator(例:LocalValidatorFactoryBean)を取得し、validator.validate(bean, Create.class)のようにグループを指定して検証します。MVCテストではMockMvcを使い、実際のコントローラに@Validatedを付けたうえでエラーバインディングを確認します。

グループ未指定の制約はどのグループで評価されますか?Defaultグループとは何ですか?

グループを明示しない制約はすべてDefaultグループに属します。@Validated(Create.class)のように特定グループだけを指定するとDefaultは評価されません。Defaultも適用したい場合は@Validated({Default.class, Create.class})のように明示的に含めるか、グループシーケンスで定義します。
カテゴリの一覧へ
新着記事
JavaのIndexOutOfBoundsExceptionを完全ガイド!初心者でも理解できる例外処理と回避方法
スッキリわかるJava入門 第4版|独学でもレッスンでも学べる完全ガイド
JavaのCookieクラスのgetCommentメソッドを解説!Servlet開発でクッキーの説明文を取得する方法
JavaのBufferedOutputStreamクラスのwriteメソッドを徹底解説!初心者でもわかるファイルへのバイナリ書き込み
人気記事
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
Spring Data JPA入門!findAll()やfindBy**()の使い方などデータベース操作の基礎を学ぶ
No.4
Java&Spring記事人気No4
Thymeleafのth:classappend属性の使い方を完全ガイド!初心者でもわかる動的クラス追加
No.5
Java&Spring記事人気No5
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.6
Java&Spring記事人気No6
Thymeleaf(タイムリーフ)入門!初心者でもわかるSpring Bootとテンプレートエンジンの使い方
No.7
Java&Spring記事人気No7
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス
No.8
Java&Spring記事人気No8
JavaのEnumクラスのordinalメソッドを徹底解説!初心者でもわかる列挙型の順序番号

💻 作業効率アップに

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

Logicool Signature M750 を見る

※ Amazon広告リンク