【Spring MVC】フォームの入力チェック方法(独自単項目チェックルールの追加)

概要

Spring MVCにてフォームの入力チェックを行う方法についてまとめた。
今回は独自の単項目入力チェックルールを作成する方法について紹介する。

 

前提

入力チェックに必要な情報は以下となる。

メッセージプロパティ定義

概要 Springのメッセージ管理を行うMessageSourceを使用して外部ファイルからメッセージを取得する方法についてまとめた。 MessageSourceはプロパティファイルに定義したメッセージを取得する機能を提供する。 […]

【Spring MVC】MessageSourceを使用する方法
入力チェックに必要な資材

概要 Spring MVCにてフォームの入力チェックを行うための準備と入力チェックの全体像についてまとめた。 入力チェックにはBean Validationを使用する。 Bean Validationの機能を使用するためには、その実装[…]

【Spring MVC】フォームの入力チェック方法(準備)
アノテーションの基本的な使い方

概要 Spring MVCにてフォームの入力チェックを行う方法についてまとめた。 入力チェックには、フォームのフィールドに入力チェック用のアノテーションを付与する。 今回は基礎的なBean Validationと、その実装であるH[…]

【Spring MVC】フォームの入力チェック方法(基本な使い方)

 

独自単項目チェックルール追加

独自の単項目入力チェックルールを追加する場合、以下の流れで作成する。

・独自アノテーションの作成
・メッセージ定義
・フィールドに適用

 

独自アノテーションの作成

以下のチェックを行う独自アノテーションを作成する。

・半角英数字であること
・8文字以上16文字以下であること

 

アノテーション作成手順

独自アノテーションをeclipseにて以下の手順で作成する。

 

【Spring MVCフォームの入力チェック方法(独自単項目チェックルールの追加)】アノテーション作成方法
▲「注釈」を選択

 

【Spring MVCフォームの入力チェック方法(独自単項目チェックルールの追加)】アノテーション作成方法_2
▲「Alphanumeric」という名前のアノテーションを作成

 

最終的な独自アノテーションクラス

最終的な独自アノテーションクラスは以下となる。

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 {}; // ⑨
}

 

@Documented // ①

「注釈」作成時のオプションで追加可能。
このアノテーションがJavadocに記載されることを意味する。

 

@Constraint(validatedBy = {}) // ②

バリデータクラスを指定することができるが、今回は@Patternを使用して処理しているため空を指定している。
上記を追加することで入力チェック処理を実行できる。

 

@Retention(RUNTIME) // ③

「注釈」作成時のオプションで追加可能。
独自バリデーションを作成する場合、基本的にランタイムとすればよし。

 

@Target({ FIELD, METHOD, PARAMETER, CONSTRUCTOR, ANNOTATION_TYPE }) // ④

「注釈」作成時のオプションで追加可能。
カスタムアノテーションを付与できる項目を指定できる。

基本的には上記で問題ないが、以下のような項目を指定できる。

属性 説明
ANNOTATION_TYPE 他のアノテーションに適用できる
CONSTRUCTOR コンストラクタ宣言に適用できる
FIELD フィールド宣言(クラス、インターフェース、列挙型のメンバー)に適用できる
LOCAL_VARIABLE ローカル変数宣言に適用できる
METHOD メソッド宣言に適用できる
PACKAGE パッケージ宣言に適用できる
PARAMETER メソッドやコンストラクタのパラメータに適用できる
TYPE クラス、インターフェース(アノテーションを含む)、列挙型に適用できる
TYPE_PARAMETER 型パラメータ宣言に適用できる
TYPE_USE 任意の型に適用できる

 

@ReportAsSingleViolation // ⑤

バリデーション違反があった場合に一つの違反として検出できるようにするアノテーション。
既存アノテーションを使用して独自アノテーションを作成する場合は必須
今回の場合、@ReportAsSingleViolationを指定しないと既存の@Patternアノテーションのデフォルトエラーメッセージが表示される

 

@Pattern(regexp = “^[a-zA-Z0-9]{8,16}$”) // ⑥

入力チェックルールの正規表現を定義している。
今回のアノテーションのメイン処理となる。

 

String message() default “”; // ⑦

独自アノテーションフィールドの必須項目。(※定義しないとエラーになる)
エラーメッセージやメッセージプロパティのkeyを指定できる。

※上記を使用するためには当記事の「補足」を参照

 

Class<?>[] groups() default {}; // ⑧

独自アノテーションフィールドの必須項目。(※定義しないとエラーになる)
バリデーショングループを作成する際に、groups属性を指定できる。

 

Class<? extends Payload>[] payload() default {}; // ⑨

独自アノテーションフィールドの必須項目。(※定義しないとエラーになる)

 

メッセージ定義

独自アノテーションのエラーメッセージを定義する。

messages_ja.properties


fooForm.password=パスワード
Alphanumeric.java.lang.String={0}は半角英数字の8文字以上16文字以下で入力してください。

 

フィールドに適用

作成した独自アノテーションを入力チェック対象フィールドに付与する。

FooForm.java


// パスワード
@Alphanumeric
private String password;

 

入力チェックエラー時は以下のように表示される。

【Spring MVCフォームの入力チェック方法(独自単項目チェックルールの追加)】アノテーション作成方法_3

 

補足

独自アノテーションの「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" />		

 

スポンサーリンク