概要
Spring MVCにてフォームの入力チェックを行う方法についてまとめた。
今回は独自の単項目入力チェックルールを作成する方法について紹介する。
前提
入力チェックに必要な情報は以下となる。
概要 Springのメッセージ管理を行うMessageSourceを使用して外部ファイルからメッセージを取得する方法についてまとめた。 MessageSourceはプロパティファイルに定義したメッセージを取得する機能を提供する。 […]
概要 Spring MVCにてフォームの入力チェックを行うための準備と入力チェックの全体像についてまとめた。 入力チェックにはBean Validationを使用する。 Bean Validationの機能を使用するためには、その実装[…]
概要 Spring MVCにてフォームの入力チェックを行う方法についてまとめた。 入力チェックには、フォームのフィールドに入力チェック用のアノテーションを付与する。 今回は基礎的なBean Validationと、その実装であるH[…]
独自単項目チェックルール追加
独自の単項目入力チェックルールを追加する場合、以下の流れで作成する。
・メッセージ定義
・フィールドに適用
独自アノテーションの作成
以下のチェックを行う独自アノテーションを作成する。
・8文字以上16文字以下であること
アノテーション作成手順
独自アノテーションをeclipseにて以下の手順で作成する。
最終的な独自アノテーションクラス
最終的な独自アノテーションクラスは以下となる。
Alphanumeric.java
package com.example.prototype.web.common.validation;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Pattern;
@Documented // ①
@Constraint(validatedBy = {}) // ②
@Retention(RUNTIME) // ③
@Target({ FIELD, METHOD, PARAMETER, CONSTRUCTOR, ANNOTATION_TYPE }) // ④
@ReportAsSingleViolation // ⑤
// 英数字であること
// 8~16文字であること
@Pattern(regexp = "^[a-zA-Z0-9]{8,16}$") // ⑥
public @interface Alphanumeric {
String message() default ""; // ⑦
Class<?>[] groups() default {}; // ⑧
Class<? extends Payload>[] payload() default {}; // ⑨
}
「注釈」作成時のオプションで追加可能。
このアノテーションがJavadocに記載されることを意味する。
バリデータクラスを指定することができるが、今回は@Patternを使用して処理しているため空を指定している。
上記を追加することで入力チェック処理を実行できる。
「注釈」作成時のオプションで追加可能。
独自バリデーションを作成する場合、基本的にランタイムとすればよし。
「注釈」作成時のオプションで追加可能。
カスタムアノテーションを付与できる項目を指定できる。
基本的には上記で問題ないが、以下のような項目を指定できる。
属性 | 説明 |
---|---|
ANNOTATION_TYPE | 他のアノテーションに適用できる |
CONSTRUCTOR | コンストラクタ宣言に適用できる |
FIELD | フィールド宣言(クラス、インターフェース、列挙型のメンバー)に適用できる |
LOCAL_VARIABLE | ローカル変数宣言に適用できる |
METHOD | メソッド宣言に適用できる |
PACKAGE | パッケージ宣言に適用できる |
PARAMETER | メソッドやコンストラクタのパラメータに適用できる |
TYPE | クラス、インターフェース(アノテーションを含む)、列挙型に適用できる |
TYPE_PARAMETER | 型パラメータ宣言に適用できる |
TYPE_USE | 任意の型に適用できる |
バリデーション違反があった場合に一つの違反として検出できるようにするアノテーション。
既存アノテーションを使用して独自アノテーションを作成する場合は必須。
今回の場合、@ReportAsSingleViolationを指定しないと既存の@Patternアノテーションのデフォルトエラーメッセージが表示される。
入力チェックルールの正規表現を定義している。
今回のアノテーションのメイン処理となる。
独自アノテーションフィールドの必須項目。(※定義しないとエラーになる)
エラーメッセージやメッセージプロパティのkeyを指定できる。
※上記を使用するためには当記事の「補足」を参照
独自アノテーションフィールドの必須項目。(※定義しないとエラーになる)
バリデーショングループを作成する際に、groups属性を指定できる。
独自アノテーションフィールドの必須項目。(※定義しないとエラーになる)
メッセージ定義
独自アノテーションのエラーメッセージを定義する。
messages_ja.properties
fooForm.password=パスワード
Alphanumeric.java.lang.String={0}は半角英数字の8文字以上16文字以下で入力してください。
フィールドに適用
作成した独自アノテーションを入力チェック対象フィールドに付与する。
FooForm.java
// パスワード
@Alphanumeric
private String password;
入力チェックエラー時は以下のように表示される。
補足
独自アノテーションの「String message() default “”;」に例えば”{xxxxx}“のようにメッセージキーを指定したい場合、Validator Beanを定義する必要がある。
springMVCContext.xml
<!-- ValidatorのBean定義 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource" />
</bean>
<!-- アノテーションを有効にする -->
<!-- <mvc:annotation-driven /> -->
<mvc:annotation-driven validator="validator" />