SpringのBean Validation入門!@NotNull/@Size/@Emailの使い方と基本アノテーションまとめ
生徒
「Springのアプリでフォーム入力チェックってどうやってやるんですか?自分でif文を書くんですか?」
先生
「SpringではBean Validationという機能を使うことで、アノテーションをつけるだけで入力値のチェックができますよ。」
生徒
「アノテーションだけで?なんか魔法みたいですね…@NotNullとか見たことありますけど、全部覚えないとダメですか?」
先生
「よく使う基本アノテーションは限られているので、今回はその中でも特に使用頻度の高い@NotNullや@Size、@Emailなどを中心に解説していきましょう。」
1. Bean Validationとは?
SpringのBean Validationは、Javaの標準仕様であるJSR 380(Bean Validation 2.0)をベースにした仕組みです。エンティティクラスやDTOクラスのフィールドにアノテーションを付けるだけで、自動的にバリデーション(入力値の検証)をしてくれるのが特徴です。
Spring Bootではspring-boot-starter-validationが依存関係に含まれていればすぐに使えるため、特別な設定もほとんど不要です。
2. よく使う基本アノテーション一覧
Springアプリケーションで使われる代表的なバリデーションアノテーションは以下の通りです。
@NotNull:nullを許容しない(空文字はOK)@NotEmpty:nullと空文字を許容しない(空白文字はOK)@NotBlank:null・空文字・空白だけの文字列を許容しない@Size(min=, max=):文字列やコレクションの長さや要素数を制限@Email:メールアドレス形式かどうかを検証@Min:最小値@Max:最大値@Pattern:正規表現による検証@Past:過去の日付@Future:未来の日付
3. 使用例:アノテーションを使ったDTO定義
以下はユーザー登録のDTOクラスにバリデーションアノテーションを使った例です。
public class UserForm {
@NotBlank(message = "ユーザー名は必須です")
@Size(min = 3, max = 20, message = "ユーザー名は3文字以上20文字以下で入力してください")
private String username;
@Email(message = "正しいメールアドレスを入力してください")
@NotBlank(message = "メールアドレスは必須です")
private String email;
@NotNull(message = "年齢は必須です")
@Min(value = 18, message = "18歳以上である必要があります")
@Max(value = 100, message = "100歳以下で入力してください")
private Integer age;
// getter/setter 省略
}
4. バリデーションの流れとコントローラーでの使い方
コントローラーでは、@Validを使って自動的にバリデーションを実行し、BindingResultで結果を取得します。
@PostMapping("/register")
public String register(@Valid UserForm form, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
return "registerForm";
}
// 正常処理
return "success";
}
バリデーションエラーがある場合、エラーメッセージを表示することでユーザーにフィードバックを返すことができます。
5. HTML側でのエラー表示の例
Thymeleafを使っている場合は、以下のようにしてエラーメッセージを表示できます。
<form th:action="@{/register}" method="post" th:object="${userForm}">
<div>
<label>ユーザー名</label>
<input type="text" th:field="*{username}" />
<div th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></div>
</div>
<div>
<label>メールアドレス</label>
<input type="email" th:field="*{email}" />
<div th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></div>
</div>
<div>
<label>年齢</label>
<input type="number" th:field="*{age}" />
<div th:if="${#fields.hasErrors('age')}" th:errors="*{age}"></div>
</div>
<button type="submit">登録</button>
</form>
6. Bean Validationを有効にするには
Spring Bootでは、spring-boot-starter-validationが含まれていれば自動で有効になります。以下のようにpom.xmlやbuild.gradleに依存関係が入っていればOKです。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
7. よくある落とし穴と注意点
バリデーションで初心者がつまずきやすいポイントも紹介しておきます。
- エラーが表示されない:
@Validをつけ忘れていないか確認しましょう。 - フォーム名が一致しない:HTMLの
th:fieldとDTOのプロパティ名が一致しているか確認。 - エラーメッセージが出ない:message属性が正しく設定されているか、またはデフォルトメッセージが有効か確認しましょう。
8. バリデーションのカスタムアノテーションについて
標準のアノテーションでは対応できない複雑なルールを実装したい場合は、独自のカスタムアノテーションを作成することも可能です。例えば、パスワードの強度チェックや、2つのフィールドの一致(パスワードと確認用パスワードなど)などがそれにあたります。
ただし初心者のうちは、まずは@NotNull、@Size、@Emailなどの基本アノテーションをしっかり使いこなせるようになることが大切です。