Springのグループバリデーションで新規作成と更新のルールを切り替える方法【初心者向け完全ガイド】
生徒
「Springで入力バリデーションをしてるんですけど、新規登録のときと編集のときでルールを変えたいです!」
先生
「なるほど。Springではグループバリデーションという機能を使うことで、新規作成と更新で異なるバリデーションルールを設定できますよ。」
生徒
「それってどうやって設定するんですか?注釈の使い方がよくわからなくて…」
先生
「それでは、グループバリデーションの基本と、Spring Bootでの具体的な使い方を詳しく見ていきましょう!」
1. Springのバリデーションとは?
Spring FrameworkやSpring Bootでは、@Validや@Validatedを使って、フォーム入力値やリクエストパラメータのバリデーションを行うことができます。よく使われる注釈には、@NotNull、@Size、@Emailなどがあり、Java Bean Validation(JSR 380)に準拠しています。
これらのバリデーションは、フォームの共通ルールに対して適用されますが、新規作成と更新で異なるルールを適用したい場合、グループバリデーションの機能が必要になります。
2. グループバリデーションとは?
グループバリデーションとは、Bean Validationで定義された複数のバリデーショングループを切り替えて使い分ける機能です。たとえば、以下のようなケースで活躍します:
- 新規登録時には、すべての項目が必須
- 更新時には、メールアドレスやパスワードは変更しなくてもよい
このような異なる入力条件を整理することで、柔軟な入力チェックが可能になります。
3. グループバリデーションを使う準備
まずは、バリデーショングループを定義するインタフェースを用意します。ここでは、新規作成用と更新用の2つのグループを定義します。
public interface CreateGroup {}
public interface UpdateGroup {}
次に、エンティティやフォームクラスにバリデーション注釈を設定します。注釈にはgroups属性を使って、どのグループに属するかを明示します。
public class UserForm {
@NotNull(groups = UpdateGroup.class)
private Long id;
@NotBlank(groups = {CreateGroup.class, UpdateGroup.class})
private String name;
@Email(groups = CreateGroup.class)
@NotBlank(groups = CreateGroup.class)
private String email;
@Size(min = 8, groups = CreateGroup.class)
private String password;
// ゲッター・セッター省略
}
4. @Validatedでグループを指定する
Spring MVCでは、@Validatedを使ってコントローラーでどのバリデーショングループを有効にするか指定します。
@PostMapping("/users")
public String createUser(@Validated(CreateGroup.class) @ModelAttribute UserForm form, BindingResult result) {
if (result.hasErrors()) {
return "user_form";
}
// 保存処理など
return "redirect:/users";
}
@PostMapping("/users/{id}")
public String updateUser(@Validated(UpdateGroup.class) @ModelAttribute UserForm form, BindingResult result) {
if (result.hasErrors()) {
return "user_form";
}
// 更新処理など
return "redirect:/users";
}
このように、処理ごとに異なるグループを指定することで、バリデーションルールを柔軟に変更できます。
5. @RequestBodyの場合の注意点
フォームではなく、JSONで受け取るような@RequestBodyを使う場合でも同じように@Validatedとグループを指定することができます。
@PostMapping("/api/users")
public ResponseEntity<?> createApiUser(@Validated(CreateGroup.class) @RequestBody UserForm form) {
// バリデーション結果は自動で例外に
return ResponseEntity.ok().build();
}
@Validではグループ指定ができないため、必ず@Validatedを使うようにしましょう。
6. グループの複数指定や継承も可能
1つの項目に対して、複数のグループでバリデーションしたい場合は、配列で指定可能です。また、グループインタフェースを継承して階層化もできます。
public interface AllGroup extends CreateGroup, UpdateGroup {}
このようにまとめて定義することで、複数のバリデーションルールを簡潔に管理できます。
7. よくあるエラーと対処法
グループバリデーションで初心者がつまずきやすいポイントをいくつか紹介します:
@Validを使っている →@Validatedに変更- groups指定がない → 対象の注釈にgroups属性を追加
- Bean Validationの依存が不足 → spring-boot-starter-validationを追加
これらのエラーを確認すれば、多くの問題は解決できます。
8. テンプレートエンジンでの連携(Thymeleafなど)
Spring Bootでは、Thymeleafなどのテンプレートエンジンと組み合わせて、エラーメッセージの表示も行えます。バリデーションエラーを画面に表示する方法の例は以下の通りです。
<form th:action="@{/users}" th:object="${userForm}" method="post">
<input type="text" th:field="*{name}" />
<div th:if="${#fields.hasErrors('name')}" th:errors="*{name}"></div>
<button type="submit">送信</button>
</form>
このようにすれば、バリデーションエラーがビューに反映され、ユーザーにわかりやすく伝えることができます。