Spring MVCで @Size を使って文字列長を制限する方法|フォームバリデーションを初心者向けに解説
新人
「Spring MVCでフォームを作っているんですが、名前の文字数を制限したいときって、どうやるんですか?」
先輩
「フォームバリデーションを使えば、入力された文字列の長さを制限できますよ。Spring MVCではアノテーションを使う方法が一般的です。」
新人
「アノテーションだけで文字数チェックができるんですか?自分でif文を書かなくてもいいんでしょうか?」
先輩
「そうです。@Sizeというアノテーションを使えば、文字列の最小文字数や最大文字数を簡単に指定できます。」
新人
「それは便利そうですね。どういう仕組みなのか、最初から知りたいです。」
先輩
「では、Spring MVCのフォームバリデーションの基本から順番に見ていきましょう。」
1. Spring MVCのフォームバリデーションとは何か
Spring MVCのフォームバリデーションとは、画面の入力フォームから送信されたデータが正しい内容かどうかをチェックする仕組みです。 Webアプリケーションでは、ユーザーが自由に文字を入力できるため、想定外の値が送信される可能性があります。 そのまま処理を進めてしまうと、エラーが発生したり、データベースに不正な値が保存されたりする原因になります。
Spring MVCでは、フォーム用のクラスにバリデーション用のアノテーションを付けることで、入力チェックを自動的に行うことができます。 これをフォームバリデーションと呼びます。 バリデーションの結果はコントローラで受け取り、エラーがあれば画面に戻してエラーメッセージを表示する、という流れになります。
pleiadesで作成したSpring MVCプロジェクトでも、この仕組みは標準で利用できます。 Gradleプロジェクトであっても設定はほとんど変わらず、pleiadesのプロジェクト作成時に依存関係をチェックしていれば、すぐに使えるのが特徴です。
2. なぜ文字列の長さ制限が必要なのか
フォームで入力される文字列には、必ず長さの制限を設けることが重要です。 例えば、名前欄に何百文字も入力されてしまうと、画面のレイアウトが崩れたり、データベースのカラムサイズを超えてエラーになったりします。
また、文字数制限をしないまま放置すると、意図しないデータが保存され、後から修正が大変になることもあります。 Spring MVCのフォームバリデーションを使えば、こうした問題を事前に防ぐことができます。
特に初心者のうちは、コントローラ内でif文を書いてチェックしがちですが、バリデーションアノテーションを使うことで、 コードが読みやすくなり、修正もしやすくなります。 Spring MVCでは、この考え方がとても重要です。
3. @Sizeアノテーションの基本的な役割
@Sizeは、Spring MVCのフォームバリデーションで使われる代表的なアノテーションのひとつです。
主に文字列の長さや、配列やリストの要素数を制限するために使用されます。
文字列に対して使用する場合は、「最小何文字以上」「最大何文字以下」といった条件を指定できます。 これにより、入力された値が条件に合わない場合、自動的にバリデーションエラーとして扱われます。
@Sizeはフォームクラスのフィールドに付与するのが基本です。
コントローラでは@Controllerを使用し、フォーム送信時にバリデーション結果を受け取ります。
この流れを理解することが、Spring MVCでのWeb開発ではとても大切です。
public class UserForm {
@Size(min = 1, max = 20)
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
上記の例では、ユーザー名は1文字以上20文字以下でなければならない、というルールを設定しています。 このように、@Sizeを使うことで、文字数制限を宣言的に書くことができます。
@Controller
public class UserController {
@PostMapping("/register")
public String register(@Valid UserForm userForm, BindingResult result) {
if (result.hasErrors()) {
return "input";
}
return "result";
}
}
コントローラでは、フォームクラスに対してバリデーションを実行し、エラーがあるかどうかを判定します。 ここで@Sizeによる文字数チェックが行われ、条件に合わない場合はエラーとして処理されます。 Spring MVCでは、この一連の流れを理解することが、フォームバリデーションを使いこなす第一歩になります。
4. @Sizeアノテーションの書き方と指定できる属性
Spring MVCで文字列の長さを制限する際に使用するのが、@Sizeアノテーションです。 @Sizeはフォームバリデーションの中でも特によく使われるアノテーションで、入力値の文字数を明確に制御できます。 初心者の方は「どこに書くのか」「何が指定できるのか」で迷いやすいポイントなので、順番に整理して理解することが大切です。
@Sizeは、主にminとmaxという二つの属性を持っています。 minは最小文字数、maxは最大文字数を表しており、この範囲に収まらない入力値はバリデーションエラーとして扱われます。 Spring MVCでは、これらの条件をアノテーションとして宣言的に書けるため、コードの可読性が高くなります。
初心者の方がつまずきやすい点として、@Sizeはコントローラクラスではなく、フォーム用クラスに記述するという点があります。 入力値そのものに対するルールであるため、フォームクラスのフィールドに付与するのが正しい使い方です。
public class SampleForm {
@Size(min = 5, max = 10)
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
上記の例では、messageという文字列に対して、五文字以上十文字以下という制限を設けています。 このように、@Sizeを使うことで「この項目はどれくらいの長さで入力してほしいのか」をコード上で明確に表現できます。 Spring MVCのフォームバリデーションでは、この宣言的な書き方が基本となります。
5. フォーム用クラス(Formクラス)での@Sizeの使い方
フォーム用クラス、いわゆるFormクラスは、画面から送信される入力値をまとめて受け取るためのクラスです。 Spring MVCでは、リクエストパラメータを直接扱うのではなく、Formクラスを用意してデータを受け取る設計が推奨されています。
@Sizeアノテーションは、このFormクラスのフィールドに記述します。 なぜなら、入力チェックは「どの項目にどんな制限があるか」という情報を、データ構造として持たせる方が分かりやすいからです。 コントローラにチェック処理を書くよりも、責務が明確になり、保守性が向上します。
pleiadesで作成したGradleプロジェクトでも、このFormクラスの考え方は同じです。 プロジェクト作成時にSpring MVC関連の依存関係をチェックしていれば、特別な設定をしなくてもフォームバリデーションを利用できます。
public class LoginForm {
@Size(min = 1, max = 30)
private String loginId;
@Size(min = 8, max = 20)
private String password;
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
このように、Formクラスでは複数のフィールドに対して@Sizeを指定することができます。 各項目ごとに適切な文字数制限を設けることで、Spring MVCのフォームバリデーションがより効果的に機能します。 初心者の方は、まず「入力項目ごとにFormクラスを書く」という意識を持つと理解しやすくなります。
6. @Validアノテーションとバリデーションの実行タイミング
@Sizeアノテーションだけを書いただけでは、実際のバリデーションは実行されません。 Spring MVCでフォームバリデーションを動かすためには、@Validアノテーションを使用する必要があります。 この@Validは、コントローラでフォームクラスを受け取る引数に付与します。
バリデーションの実行タイミングは、フォームが送信され、コントローラのメソッドが呼び出されたときです。 @Validが付いているフォームクラスに対して、Spring MVCが自動的にバリデーション処理を行います。 その結果はBindingResultというオブジェクトに格納されます。
初心者の方がよく混乱するポイントとして、@ValidとBindingResultの順番があります。 BindingResultは、必ず@Validを付けた引数の直後に書かなければなりません。 この順番を間違えると、バリデーションエラーが正しく取得できなくなります。
@Controller
public class LoginController {
@PostMapping("/login")
public String login(@Valid LoginForm loginForm, BindingResult result) {
if (result.hasErrors()) {
return "login";
}
return "home";
}
}
上記のように、@Validを付けることで、Formクラスに記述した@Sizeによる文字数チェックが実行されます。 Spring MVCでは、この仕組みによって入力チェックと画面制御を分離できるのが大きな特徴です。
7. バリデーションエラーが発生する仕組み
Spring MVCでバリデーションエラーが発生する仕組みを理解しておくことは、初心者にとって非常に重要です。 @Sizeの条件に合わない入力が行われた場合、その時点で例外が発生するわけではありません。 バリデーションエラーとして情報が蓄積され、BindingResultにまとめられます。
BindingResultには、どの項目でどのようなエラーが発生したのかという情報が格納されています。 コントローラでは、この情報を元に「入力画面に戻すのか」「次の画面へ進むのか」を判断します。 この流れを理解していないと、なぜ画面が遷移しないのか分からず、つまずく原因になります。
Spring MVCのフォームバリデーションは、入力チェックを自動化しつつ、エラー処理を柔軟に制御できる点が特徴です。 @Sizeによる文字数制限は、その中でも最も基本的で重要な役割を果たします。 この仕組みを正しく理解することで、より安全で使いやすいWebアプリケーションを作成できるようになります。
8. バリデーションエラー時の画面表示の仕組み
Spring MVCのフォームバリデーションで初心者が最初につまずきやすいのが、 「なぜ入力画面に戻るのか」「なぜ次の画面に進まないのか」という点です。 これは、バリデーションエラーが発生したときの画面遷移の仕組みを理解していないことが原因です。
フォーム送信時に@Sizeによる文字数制限に違反すると、Spring MVCは自動的にバリデーションエラーを検出します。 その結果はBindingResultに格納され、コントローラ側で確認されます。 エラーが一つでも存在する場合、通常は入力画面に戻す処理を行います。
つまり、画面が戻るのは「失敗したから」ではなく、 「入力内容に問題があるため、再入力を促す」という正しい挙動です。 Spring MVCのバリデーションは、この流れを前提として設計されています。
@PostMapping("/register")
public String register(@Valid UserForm userForm, BindingResult result) {
if (result.hasErrors()) {
return "input";
}
return "confirm";
}
このように、BindingResultにエラーが含まれている場合は入力画面に戻すことで、 ユーザーに修正の機会を与えることができます。 これがSpring MVCにおけるバリデーションエラー時の基本的な画面表示の仕組みです。
9. エラーメッセージの表示方法と考え方
バリデーションエラーが発生しただけでは、ユーザーには何が問題なのか伝わりません。 そこで重要になるのが、Thymeleafを使ったエラーメッセージの表示です。 Spring MVCでは、BindingResultの情報をThymeleaf側で簡単に扱うことができます。
エラーメッセージは「なぜ入力が間違っているのか」を明確に伝える必要があります。 例えば、文字数制限に引っかかった場合は、 「何文字以上、何文字以下で入力してください」と具体的に示すことが大切です。
<form th:action="@{/register}" th:object="${userForm}" method="post">
<input type="text" th:field="*{userName}">
<div th:if="${#fields.hasErrors('userName')}">
<span th:errors="*{userName}"></span>
</div>
<button type="submit">送信</button>
</form>
このように記述することで、@Sizeによるバリデーションエラーが発生した場合、 対応する項目の下にエラーメッセージが表示されます。 Spring MVCとThymeleafを組み合わせることで、エラー表示の実装が非常にシンプルになります。
10. @Sizeを使う際の注意点(全角・半角、min/maxの考え方)
@Sizeを使う際に注意しなければならない点として、 全角文字と半角文字の扱いがあります。 @Sizeは文字数を基準にチェックを行うため、全角か半角かに関係なく一文字としてカウントされます。
そのため、「全角は二文字分として扱いたい」といった要件がある場合は、 @Sizeだけでは対応できません。 初心者のうちは、@Sizeは単純な文字数制限用と考えておくと理解しやすいです。
また、minとmaxの値をどのように決めるかも重要です。 最小文字数をゼロにする場合は、入力必須ではない項目であることを意味します。 入力必須にしたい場合は、minを一以上に設定する必要があります。
11. よくあるエラーとその対処方法
Spring MVCで@Sizeを使ったフォームバリデーションを実装する際、 初心者がよく遭遇するエラーはいくつかあります。 代表的なのが、@Validを付け忘れてしまうケースです。
Formクラスに@Sizeを書いても、コントローラ側で@Validを付けていなければ、 バリデーションは実行されません。 「なぜ文字数制限が効かないのか」と悩んだ場合は、 まず@Validが付いているかを確認することが大切です。
もう一つ多いのが、BindingResultの位置を間違えるケースです。 BindingResultは@Validを付けた引数の直後に書かなければなりません。 この順番が崩れると、Spring MVCは正しくエラー情報を取得できません。
12. 初心者が最初に覚えるべきポイント
Spring MVCで@Sizeを使って文字列長を制限する方法は、 フォームバリデーションの中でも最も基本的で重要な知識です。 入力チェックをアノテーションで宣言的に書くことで、 コードの見通しが良くなり、保守性も向上します。
初心者の方は、@SizeはFormクラスに書くこと、 @Validはコントローラで指定すること、 そしてBindingResultでエラーを判定するという流れを、 一つのセットとして覚えることが大切です。
Spring MVCのバリデーションは最初は難しく感じますが、 仕組みを理解すると非常に強力な機能になります。 文字数制限を正しく実装できるようになることで、 より安全で使いやすいWebアプリケーションを作れるようになります。