Spring MVCの@Patternによる正規表現バリデーション入門|初心者向けに仕組みから丁寧に解説
新人
「Spring MVCでフォームを作っているんですが、入力内容を細かくチェックしたいときって、どうすればいいんですか?」
先輩
「その場合は、フォームバリデーションを使うのが基本ですね。特に決まった形式で入力させたいなら、正規表現を使ったバリデーションが便利ですよ。」
新人
「正規表現って聞くと、なんだか難しそうなイメージがあります……。」
先輩
「最初はそう感じるかもしれませんが、Spring MVCでは@Patternというアノテーションを使うだけで、簡単に正規表現バリデーションができます。」
新人
「アノテーションを付けるだけで入力チェックができるんですか?仕組みから知りたいです。」
先輩
「では、まずSpring MVCのフォームバリデーション自体が何なのかから説明していきましょう。」
1. Spring MVCのフォームバリデーションとは何か
Spring MVCのフォームバリデーションとは、画面の入力フォームから送信された値が、 あらかじめ決められたルールに合っているかどうかを自動的にチェックする仕組みです。 Webアプリケーションでは、ユーザーが自由に文字を入力できるため、 想定していない形式のデータが送信される可能性があります。
例えば、数字だけを入力してほしい項目に文字が入力されたり、 メールアドレスの形式が正しくない値が送信されたりするケースです。 こうした問題を放置すると、アプリケーションの動作不良やデータ不整合の原因になります。
Spring MVCでは、フォーム用クラスにバリデーション用のアノテーションを付与することで、 入力チェックを自動化できます。 pleiadesで作成したGradleプロジェクトでも、この仕組みは標準で利用でき、 プロジェクト作成時に依存関係をチェックしていれば、追加設定はほとんど必要ありません。
2. 正規表現による入力チェックが必要になる場面
正規表現による入力チェックが必要になるのは、 「この形式で入力してほしい」という明確なルールがある場合です。 例えば、電話番号は数字とハイフンのみ、 郵便番号は決まった桁数、 英数字のみを許可したログインIDなどが代表的な例です。
これらを単純な文字数制限だけでチェックしようとすると、 想定外の入力を防ぐことができません。 そこで、入力パターンそのものを指定できる正規表現が役立ちます。 Spring MVCでは、正規表現バリデーションを簡単に実装できるように、 @Patternアノテーションが用意されています。
初心者の方は「正規表現は難しいもの」と感じがちですが、 最初はシンプルなパターンから使えば問題ありません。 Spring MVCのフォームバリデーションの中で、 正規表現は入力品質を高めるための重要な役割を果たします。
3. @Patternアノテーションの基本的な役割
@Patternアノテーションは、Spring MVCのフォームバリデーションで、 入力値が特定の正規表現に一致しているかをチェックするためのアノテーションです。 主に文字列型のフィールドに対して使用します。
@Patternでは、正規表現を指定することで、 「この条件に合わない入力はエラーにする」というルールを定義できます。 そのため、入力形式が厳密に決まっている項目に非常に向いています。 このチェックはコントローラではなく、フォーム用クラスに記述するのが基本です。
public class SampleForm {
@Pattern(regexp = "^[0-9]+$")
private String numberOnly;
public String getNumberOnly() {
return numberOnly;
}
public void setNumberOnly(String numberOnly) {
this.numberOnly = numberOnly;
}
}
上記の例では、数字のみを許可する正規表現を指定しています。 このように、@Patternを使うことで、 Spring MVCのフォームバリデーションに正規表現による入力チェックを簡単に組み込めます。
@Controller
public class SampleController {
@PostMapping("/check")
public String check(@Valid SampleForm sampleForm, BindingResult result) {
if (result.hasErrors()) {
return "input";
}
return "result";
}
}
コントローラでは、@Validを使ってフォームバリデーションを実行し、 エラーがあれば入力画面に戻す、という流れになります。 Spring MVCでは、この一連の仕組みを理解することが、 正規表現バリデーションを使いこなす第一歩になります。
4. @Patternアノテーションの書き方と指定できる属性
Spring MVCの正規表現バリデーションで中心となるのが、@Patternアノテーションです。 @Patternは、入力された文字列が指定した正規表現に一致しているかどうかを判定するために使います。 文字数だけでは判定できない入力形式をチェックしたい場合に、非常に重要な役割を持ちます。
@Patternで必ず指定するのが、regexp属性です。 regexpには、チェックしたい正規表現を文字列として記述します。 この正規表現に一致しない入力が行われた場合、Spring MVCのフォームバリデーションではエラーとして扱われます。
初心者の方が混乱しやすいポイントとして、 正規表現はコントローラではなくFormクラスに書く、という点があります。 入力値そのもののルールはデータ構造側に持たせることで、 Spring MVCの設計が分かりやすくなり、保守もしやすくなります。
public class UserForm {
@Pattern(regexp = "^[a-zA-Z0-9]+$")
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
この例では、英字と数字のみを許可する正規表現を指定しています。 記号や全角文字が含まれた場合は、Spring MVCのバリデーションによってエラーになります。 このように、@Patternは入力形式を厳密に制御したいときに使うアノテーションです。
5. Formクラスでの@Patternの使い方
Formクラスは、画面から送信された入力値をまとめて受け取るためのクラスです。 Spring MVCでは、リクエストパラメータを直接扱うのではなく、 Formクラスを経由して値を受け取る設計が基本となっています。
@Patternは、このFormクラスのフィールドに付与します。 なぜなら、どの入力項目にどのような形式制限があるのかを、 クラスの定義を見るだけで把握できるようにするためです。 コントローラにチェック処理を書くよりも、責務が明確になります。
pleiadesで作成したGradleプロジェクトでも、この考え方は変わりません。 プロジェクト作成時にSpring MVC関連の依存関係をチェックしていれば、 @Patternを使った正規表現バリデーションはすぐに利用できます。
public class RegisterForm {
@Pattern(regexp = "^[0-9]{3}-[0-9]{4}$")
private String zipCode;
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
この例では、郵便番号を想定し、 三桁の数字、ハイフン、四桁の数字という形式を指定しています。 正規表現の意味を文章で理解しながら書くことが、 Spring MVCで正規表現バリデーションを使う際の大切なポイントです。
6. よく使われる正規表現の例
Spring MVCの@Patternでよく使われる正規表現には、いくつか代表的なパターンがあります。 初心者の方は、まず頻出する形式から覚えていくのがおすすめです。 正規表現は一度に全て理解しようとせず、 必要になったものから少しずつ使い慣れていくのが現実的です。
例えば、数字のみを許可する場合は、 数字が一回以上続くことを意味する正規表現を使います。 英数字のみの場合は、英字と数字の集合を指定します。 メールアドレスのように形式が複雑な場合も、 正規表現を使うことで入力チェックが可能になります。
public class PatternSampleForm {
@Pattern(regexp = "^[0-9]+$")
private String numberOnly;
@Pattern(regexp = "^[a-zA-Z0-9]+$")
private String alphaNumeric;
@Pattern(regexp = "^[^@]+@[^@]+$")
private String email;
public String getNumberOnly() {
return numberOnly;
}
public void setNumberOnly(String numberOnly) {
this.numberOnly = numberOnly;
}
public String getAlphaNumeric() {
return alphaNumeric;
}
public void setAlphaNumeric(String alphaNumeric) {
this.alphaNumeric = alphaNumeric;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
ここで重要なのは、正規表現の意味を理解したうえで使うことです。 例えば、数字のみの正規表現は「数字が一文字以上続く」ことを表しています。 メール形式の正規表現は簡易的な例であり、 実際の業務では要件に応じて調整する必要があります。
7. @Validアノテーションとバリデーション実行の流れ
@PatternをFormクラスに書いただけでは、 Spring MVCのバリデーションは自動的には実行されません。 フォーム送信時にバリデーションを動かすためには、 コントローラで@Validアノテーションを指定する必要があります。
@Validは、Spring MVCに対して 「このFormクラスに定義されているバリデーションルールを実行してください」 と指示する役割を持っています。 バリデーションの結果はBindingResultに格納され、 エラーがあるかどうかを判定するために使われます。
初心者がよくつまずく点として、 @ValidとBindingResultの順番があります。 BindingResultは、必ず@Validを付けた引数の直後に書く必要があります。 この順番を間違えると、Spring MVCは正しくエラー情報を取得できません。
@Controller
public class RegisterController {
@PostMapping("/register")
public String register(@Valid RegisterForm registerForm, BindingResult result) {
if (result.hasErrors()) {
return "register";
}
return "complete";
}
}
このように、Formクラスに@Patternで正規表現を定義し、 コントローラで@Validを指定することで、 Spring MVCの正規表現バリデーションが実行されます。 この一連の流れを理解することが、 @Patternを正しく使いこなすための重要なポイントです。
8. バリデーションエラー時の画面表示の仕組み
Spring MVCで@Patternを使った正規表現バリデーションを実装すると、 条件に合わない入力が行われた場合、自動的にバリデーションエラーが発生します。 ここで初心者が疑問に感じやすいのが、 「なぜ画面が次に進まないのか」「なぜ入力画面に戻されるのか」という点です。
これはSpring MVCのフォームバリデーションの仕様によるものです。 フォーム送信時に@Validが指定されている場合、 入力内容はまずバリデーションチェックにかけられます。 @Patternの正規表現に一致しない場合、 エラー情報がBindingResultに格納されます。
コントローラでは、このBindingResultを確認し、 エラーが存在する場合は入力画面を再表示する、という制御を行います。 そのため、エラーがある状態では次の画面に進まないのが正しい挙動です。 Spring MVC バリデーションの基本的な考え方として、 「正しい入力が行われるまで処理を進めない」という設計になっています。
@PostMapping("/input")
public String input(@Valid PatternForm patternForm, BindingResult result) {
if (result.hasErrors()) {
return "input";
}
return "confirm";
}
このように、@Patternによる正規表現入力チェックでエラーが出た場合は、 入力画面に戻して再入力を促す流れになります。 画面遷移が止まったように見えても、 実際にはSpring MVCが安全に処理を止めている状態だと理解しておきましょう。
9. エラーメッセージの考え方と設定方法
正規表現バリデーションでエラーが発生した場合、 ただ画面に戻るだけでは、ユーザーは何を直せばよいのか分かりません。 そこで重要になるのが、エラーメッセージの表示です。
Spring MVCでは、BindingResultに格納されたエラー情報を、 Thymeleafを使って画面に表示することができます。 エラーメッセージは、 「入力内容が正規表現に一致していない」ことを、 できるだけ分かりやすい日本語で伝える必要があります。
<form th:action="@{/input}" th:object="${patternForm}" method="post">
<input type="text" th:field="*{userId}">
<div th:if="${#fields.hasErrors('userId')}">
<span th:errors="*{userId}"></span>
</div>
<button type="submit">送信</button>
</form>
このように記述することで、 @Patternエラーが発生した場合に対応する項目の下へエラーメッセージが表示されます。 Spring MVC バリデーションとThymeleafを組み合わせることで、 正規表現入力チェックの結果を自然な形でユーザーに伝えることができます。
10. @Patternを使う際の注意点
@Patternによる正規表現バリデーションを使う際には、 いくつか注意しておきたいポイントがあります。 その中でも特に重要なのが、全角文字と半角文字の扱いです。
正規表現は基本的に文字コード単位で判定されるため、 全角数字と半角数字は別物として扱われます。 例えば、数字のみを許可する正規表現を指定している場合でも、 全角数字が入力されると@Patternエラーになります。
また、正規表現を複雑にしすぎるのも初心者が陥りやすい落とし穴です。 条件を一つの正規表現で無理に表現しようとすると、 可読性が下がり、後から修正が難しくなります。 Spring MVCでは、必要に応じてバリデーションを分けて考えることも大切です。
11. よくあるエラーと初心者がつまずきやすいポイント
Spring MVCで@Patternを使い始めた初心者がよく遭遇するエラーには、 いくつか共通した原因があります。 その代表例が、@Validを付け忘れてしまうケースです。
Formクラスに@Patternを書いていても、 コントローラで@Validを指定していなければ、 正規表現バリデーションは実行されません。 「なぜ入力チェックが効かないのか」と感じた場合は、 まず@Validの有無を確認しましょう。
また、BindingResultの位置を間違えるのもよくあるミスです。 BindingResultは、@Validを付けた引数の直後に書かなければなりません。 この順番が崩れると、Spring MVCは正しくエラー情報を受け取れなくなります。
12. 正規表現バリデーションを安全に使うための考え方
正規表現バリデーションは非常に強力ですが、 使い方を誤ると、逆に分かりにくい仕様になってしまうことがあります。 そのため、Spring MVCで@Patternを使う際は、 「誰が見ても理解できるか」という視点を大切にする必要があります。
正規表現はできるだけシンプルに保ち、 文章による説明とセットで管理することが重要です。 また、入力チェックの目的を明確にし、 本当に正規表現が必要なのかを考えることも大切です。
Spring MVC バリデーションにおける@Patternは、 入力チェックを安全に行うための一つの手段です。 正規表現入力チェックを正しく理解し、 無理のない形で使いこなすことで、 より安全で使いやすいWebアプリケーションを作れるようになります。