JavaのSpringで使う@Lengthアノテーション入門ガイド!初心者でもわかる入力チェック
生徒
「Springで文字列の長さを制限してチェックする方法はありますか?」
先生
「はい、@Lengthアノテーションを使えば、文字列の最小長さや最大長さを簡単に指定できますよ。」
生徒
「例えばパスワードが8文字以上でないとダメ、というルールも書けますか?」
先生
「もちろん可能です。実際のコード例を一緒に見ていきましょう。」
1. @Lengthアノテーションとは?
@Lengthアノテーションは、Hibernate Validatorが提供している文字列専用のバリデーションアノテーションです。JavaのSpringアプリケーションでフォーム入力をチェックするときによく使われ、文字列が一定の範囲の長さに収まっているかどうかを検証します。例えば「ユーザー名は3文字以上50文字以下」といったルールを簡単に定義できます。
2. @Lengthアノテーションの基本的な使い方
実際のコードでは、DTOやエンティティのフィールドに@Lengthを付与して使います。以下のサンプルはユーザー名を検証する例です。
import org.hibernate.validator.constraints.Length;
import jakarta.validation.constraints.NotBlank;
public class UserForm {
@NotBlank(message = "ユーザー名は必須です")
@Length(min = 3, max = 50, message = "ユーザー名は3文字以上50文字以内で入力してください")
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
この例では必須入力の@NotBlankと組み合わせることで、空入力も防止しつつ長さ制限を行っています。
3. @Lengthと@Sizeの違い
@Lengthとよく似たアノテーションに@Sizeがあります。@Sizeはコレクションや配列にも利用できますが、@Lengthは文字列専用です。そのため、文字列に特化したバリデーションを書くときには@Lengthを使う方がわかりやすくなります。
4. Spring MVCでのバリデーション処理
Spring MVCのコントローラで@ValidとBindingResultを利用すれば、@Lengthによるチェックは自動的に行われます。以下は入力フォームの検証例です。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import jakarta.validation.Valid;
@Controller
public class UserController {
@GetMapping("/user")
public String showForm(UserForm userForm) {
return "userForm";
}
@PostMapping("/user")
public String submitForm(@Valid UserForm userForm, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
return "userForm";
}
model.addAttribute("username", userForm.getUsername());
return "success";
}
}
このように記述すれば、エラー時には自動的にエラーメッセージが処理されます。
5. エラーメッセージのカスタマイズ
@Lengthアノテーションではmessage属性を指定することで、わかりやすい日本語メッセージを表示できます。初心者向けには「〇文字以上〇文字以内で入力してください」と具体的に伝えるのがおすすめです。
@Length(min = 8, max = 20, message = "パスワードは8文字以上20文字以内で入力してください")
private String password;
6. 入力チェックの実用例
実際のアプリケーションでは、ユーザー登録フォームやブログ記事のタイトル入力などさまざまな場面で@Lengthが使われます。以下のように複数フィールドに適用してバリデーションを強化できます。
@Length(min = 5, max = 100, message = "タイトルは5文字以上100文字以内で入力してください")
private String title;
@Length(min = 10, max = 1000, message = "本文は10文字以上1000文字以内で入力してください")
private String content;
7. HTMLフォームとの連携
HTMLフォームの入力欄にmaxlengthを設定しておくと、フロントエンドでも入力制限をかけられます。これをSpringの@Lengthと併用すれば、より安全で使いやすいフォームが作れます。
<form action="/user" method="post">
<label for="username">ユーザー名</label>
<input type="text" id="username" name="username" maxlength="50" required />
<button type="submit">送信</button>
</form>
8. 初心者が理解しておきたいポイント
初心者がSpringの@Lengthアノテーションを使う際に押さえておきたいポイントは以下の通りです。
- 文字列の長さ制限に特化したバリデーション
- @NotBlankと組み合わせて必須入力もチェック
- @Sizeとの違いを理解して使い分ける
- エラーメッセージはわかりやすい日本語にカスタマイズする
- フロントエンドとサーバーサイドで二重チェックを行うと安心
これらを理解すれば、実際の開発現場でも@Lengthを活用して安全で信頼性の高い入力フォームを実装できます。
まとめ
JavaのSpringで使う@Lengthアノテーションを理解すると、ユーザー登録フォーム、ログインフォーム、パスワード入力、ブログ記事のタイトル、問い合わせ内容など、文字列の長さを安全にチェックできるようになります。Webアプリケーションでは、利用者が入力した文字が短すぎたり、長すぎたりすると、データベース保存時のエラーや画面崩れ、セキュリティ上の問題につながることがあります。そのため、入力チェックは見た目のためだけでなく、システム全体を安全に動かすためにも大切です。
@Lengthは、Hibernate Validatorが提供している文字列専用のバリデーションアノテーションです。minで最小文字数、maxで最大文字数を指定でき、messageでエラー時に表示するメッセージを設定できます。たとえば、ユーザー名を三文字以上五十文字以内にしたい場合や、パスワードを八文字以上二十文字以内にしたい場合に、DTOやフォームクラスのフィールドへ簡単に指定できます。
Spring MVCでは、@ValidとBindingResultを組み合わせることで、@Lengthによる入力チェックを自動的に実行できます。Controller側でBindingResultにエラーがあるか確認し、エラーがあれば入力フォームへ戻し、問題がなければ登録処理へ進めます。この流れを覚えると、Spring BootやSpring MVCでのフォームバリデーション全体が理解しやすくなります。
Lengthアノテーションの基本を確認
@Lengthは文字列の長さをチェックするためのアノテーションです。必須入力のチェックは@NotBlank、文字数のチェックは@Lengthというように、役割を分けて組み合わせると分かりやすくなります。空欄を禁止したい場合は、@Lengthだけでなく@NotBlankも一緒に使うのが基本です。
import org.hibernate.validator.constraints.Length;
import jakarta.validation.constraints.NotBlank;
public class UserForm {
@NotBlank(message = "ユーザー名は必須です")
@Length(min = 3, max = 50, message = "ユーザー名は3文字以上50文字以内で入力してください")
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
このコードでは、usernameが空欄でないことと、三文字以上五十文字以内であることをチェックしています。@NotBlankが空欄チェック、@Lengthが文字数チェックを担当しているため、入力ルールが読みやすくなります。初心者のうちは、一つのアノテーションですべてを解決しようとせず、目的に合ったアノテーションを組み合わせる意識を持つとよいです。
パスワード入力での活用例
パスワードは、短すぎると推測されやすく、長すぎると入力ミスや保存ルールの問題が起きる場合があります。そのため、@Lengthを使って文字数の範囲を明確に決めておくことが大切です。
import org.hibernate.validator.constraints.Length;
import jakarta.validation.constraints.NotBlank;
public class PasswordForm {
@NotBlank(message = "パスワードは必須です")
@Length(min = 8, max = 20, message = "パスワードは8文字以上20文字以内で入力してください")
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
このように書くことで、入力されたパスワードが八文字未満の場合や二十文字を超える場合にエラーを出せます。実務では、文字数だけでなく、英数字を含める、記号を含める、同じ文字を連続させないなどのルールを追加することもあります。その場合は、@Patternなどの別のアノテーションと組み合わせて使います。
Controllerでバリデーションを実行する流れ
Spring MVCでは、フォームクラスに@Lengthを書いただけではなく、Controller側で@Validを付けて受け取ることでバリデーションが実行されます。BindingResultを使うと、エラーがあるかどうかを確認できます。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import jakarta.validation.Valid;
@Controller
public class UserController {
@GetMapping("/user")
public String showForm(UserForm userForm) {
return "userForm";
}
@PostMapping("/user")
public String submitForm(@Valid UserForm userForm, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
return "userForm";
}
model.addAttribute("username", userForm.getUsername());
return "success";
}
}
このコードでは、送信されたUserFormに対して@Validで入力チェックを行い、エラーがあればuserForm画面に戻しています。BindingResultは、@Validの直後に書くことが重要です。順番を間違えると正しくエラーを受け取れないことがあるため、初心者はこの並びをセットで覚えておきましょう。
HTMLフォームとの連携
サーバー側では@Lengthで厳密に入力チェックを行い、画面側ではmaxlengthやrequiredを設定して利用者が入力しやすいフォームにできます。HTML側のチェックだけでは改ざんや直接送信を防げないため、必ずSpring側のバリデーションも行うことが大切です。
<form action="/user" method="post" class="card p-3">
<div class="mb-3">
<label for="username" class="form-label">ユーザー名</label>
<input type="text" id="username" name="username" maxlength="50" required class="form-control">
</div>
<div class="mb-3">
<label for="password" class="form-label">パスワード</label>
<input type="password" id="password" name="password" maxlength="20" required class="form-control">
</div>
<button type="submit" class="btn btn-primary">送信</button>
</form>
このHTMLフォームでは、Bootstrapのform-controlやcardを使って見やすい入力欄にしています。maxlengthを設定しておくと、ブラウザ上で入力できる最大文字数を制限できます。ただし、HTMLのmaxlengthは利用者の操作を補助するためのものなので、最終的な安全性はサーバー側の@Lengthで確保します。
LengthとSizeの使い分け
@Lengthと@Sizeは似ていますが、役割に違いがあります。@Lengthは文字列の長さをチェックするためのHibernate Validator独自のアノテーションです。一方、@Sizeは文字列だけでなく、Listや配列などの要素数チェックにも使えます。文字列専用として分かりやすく書きたい場合は@Length、標準的なBean Validationとして広く使いたい場合は@Sizeを選ぶことがあります。
どちらを使っても文字列の長さチェックはできますが、チーム開発では表記を統一することも大切です。プロジェクトで@Sizeを使う方針なのか、文字列には@Lengthを使う方針なのかを決めておくと、コードの読みやすさが上がります。
実務で使う入力チェックの考え方
実務では、ユーザー名、パスワード、メールアドレス、タイトル、本文、コメント、住所、備考など、さまざまな文字列入力があります。すべての入力欄に同じルールを適用するのではなく、項目の目的に合わせて最小文字数と最大文字数を決めることが重要です。たとえば、タイトルは短すぎると内容が伝わりにくく、長すぎると一覧画面で崩れやすくなります。備考欄は長めに許可しても、ユーザー名は短めに制限するなど、画面設計とデータベース設計の両方を考える必要があります。
import org.hibernate.validator.constraints.Length;
import jakarta.validation.constraints.NotBlank;
public class ArticleForm {
@NotBlank(message = "タイトルは必須です")
@Length(min = 5, max = 100, message = "タイトルは5文字以上100文字以内で入力してください")
private String title;
@NotBlank(message = "本文は必須です")
@Length(min = 10, max = 1000, message = "本文は10文字以上1000文字以内で入力してください")
private String content;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
このように項目ごとにメッセージを分けることで、利用者に何を直せばよいのか伝わりやすくなります。エラーメッセージは、ただ入力エラーですと表示するよりも、何文字以上何文字以内で入力してくださいと具体的に書くほうが親切です。
Java、Spring、Spring Boot、Spring MVC、@Length、Hibernate Validator、入力チェック、バリデーション、フォーム、DTO、@Valid、BindingResult、@NotBlank、@Size、エラーメッセージ、文字数制限、パスワード、ユーザー名、HTMLフォーム、maxlength、Bootstrap、サーバーサイドバリデーションといったキーワードは、Springの入力チェックを学ぶうえで重要です。これらを関連づけて理解すると、見た目だけでなく安全性と保守性を意識したフォームを作れるようになります。
初心者は、まず一つの入力欄に@NotBlankと@Lengthを付けて、エラー時にフォーム画面へ戻る流れを確認するとよいです。次に複数フィールドに@Lengthを追加し、エラーメッセージを項目ごとに変えてみましょう。その後、HTMLのmaxlengthやrequiredと組み合わせることで、フロントエンドとサーバーサイドの二重チェックの考え方が身につきます。
@Lengthアノテーションは、文字列の長さを分かりやすく制限できる便利な機能です。ただし、@Lengthだけで必須入力や形式チェックまで完全に行えるわけではありません。空欄チェックには@NotBlank、形式チェックには@Pattern、メールアドレスには@Emailなど、目的に合ったアノテーションと組み合わせることが大切です。入力チェックを丁寧に設計することで、利用者に優しく、安全で信頼性の高いSpringアプリケーションを作っていきましょう。
生徒
@Lengthは、Springのフォーム入力で文字列の長さをチェックするために使えるアノテーションだと分かりました。
先生
その通りです。最小文字数と最大文字数を指定して、入力値の長さを検証できます。
生徒
空欄を防ぐには@Lengthだけでなく@NotBlankも組み合わせる必要があるのですね。
先生
はい。@Lengthは文字数チェック、@NotBlankは必須入力チェックというように役割が違います。
生徒
Controllerでは@ValidとBindingResultを使うと、@Lengthのチェック結果を受け取れるのですね。
先生
はい。BindingResultにエラーがあれば、入力フォームへ戻してエラーメッセージを表示できます。
生徒
@Lengthと@Sizeは似ていますが、@Lengthは文字列専用で、@Sizeは文字列以外にも使えるのですね。
先生
その理解で大丈夫です。プロジェクトの方針に合わせて使い分けるとよいです。
生徒
HTMLのmaxlengthを使っても、サーバー側の@Lengthは必要なのですね。
先生
はい。ブラウザ側の制限は補助であり、最終的なチェックはサーバー側で行う必要があります。
生徒
エラーメッセージは、何文字以上何文字以内と具体的に書くと利用者に分かりやすいですね。
先生
その通りです。@Lengthを正しく使い、@NotBlankやHTMLフォームとも組み合わせて、安全で使いやすい入力フォームを作っていきましょう。