目次 > 第2章 Server(Rich)版チュートリアル > 2.6 入力チェック(相関) > 2.6.1 相関チェックの設定
2.6.1 相関チェックの設定
相関チェックのチェック処理は、BaseMultiFieldValidatorを実装した相関チェッククラスに実装する。
本項では、相関チェッククラスの実装方法と、バリデーション設定ファイルの記述方法について説明する。
手順
本項では以下の作業が必要になる。
- (1) メッセージリソースファイルの編集
- (2) 相関チェッククラスの作成
- (3) アプリケーション共通のSpring設定ファイルの確認
- (4) “tutorial-controller.xml”の編集
(1) メッセージリソースファイルの編集
入力チェックのエラーメッセージを追加する。
- “terasoluna-spring-rich-blank\sources\application-messages.properties”を開き、以下のメッセージを追加する。
#共通 error.common.00001=システムに例外が発生しました。管理者に問い合わせてください。 #Validation error.multiField=[{0}]から計算した[{1}]が入力された[{1}]と一致しません。
(2) 相関チェッククラスの作成
チェック処理を実装するクラスを作成する。
- “terasoluna-spring-rich-blank\sources”を右クリックする。
- 「新規」→「クラス」を選択する。
- 以下の通り入力し、「終了」ボタンを押下する。
- パッケージ:jp.terasoluna.rich.tutorial.service.validation
- 名前:AgeValidator
- スーパークラス:jp.terasoluna.fw.validation.springmodules.BaseMultiFieldValidator
- 生成されたAgeValidatorクラスを以下のように編集する。
package jp.terasoluna.rich.tutorial.service.validation; import java.util.Calendar; import java.util.Date; import org.springframework.validation.Errors; import jp.terasoluna.fw.util.DateUtil; import jp.terasoluna.fw.validation.springmodules.BaseMultiFieldValidator; import jp.terasoluna.rich.tutorial.service.bean.UserBean; /** * 入力された年齢と、生年月日の相関入力チェックを行う。 * */ public class AgeValidator extends BaseMultiFieldValidator { /** * 入力された年齢と、生年月日の相関入力チェックを行う。 * * @param obj 検査対象のJavaBean(UserBean) * @param errors エラー */ @Override protected void validateMultiField(Object obj, Errors errors) { // キャスト可能かのチェック if (!(obj instanceof UserBean)) { errors.reject("error.common.00001"); return; } // キャスト UserBean userBean = (UserBean) obj; // 年齢と日付の取得 int age = userBean.getAge(); Date birth = userBean.getBirth(); // 入力された年齢と、生年月日の相関入力チェック if (!validate(birth, age)) { String[] msg = { "age", "birth" }; errors.rejectValue("birth", "error.multiField", msg, null); } } /** * 入力された年齢と、生年月日の相関入力チェックを行う。 * * @param birth 生年月日 * @param age 年齢 * @return チェック結果 */ private boolean validate(Date birth, int age) { // 生年月日+年齢のCalendarを生成 Calendar calendarBirth = Calendar.getInstance(); calendarBirth.setTime(birth); calendarBirth.add(Calendar.YEAR, age); // 生年月日+年齢+1年のCalendarを生成 Calendar calendarNextYear = Calendar.getInstance(); calendarNextYear.setTime(birth); calendarNextYear.add(Calendar.YEAR, age + 1); // 現在日付のCalendarを生成 Calendar calendarSystemTime = Calendar.getInstance(); calendarSystemTime.setTime(DateUtil.getSystemTime()); if (calendarBirth.before(calendarSystemTime) && calendarNextYear.after(calendarSystemTime)) { return true; } else { return false; } } }
相関チェッククラスとしてBaseMultiFieldValidatorを実装して作成する。この相関チェッククラスでは、以下の機能を実装している。
- 相関チェック対象のオブジェクトがUserBeanクラスかの判定をする。
- 入力された生年月日と年齢と現在日付の相関チェックをする。
- 結果値を戻す。
errors.rejectValueはエラーを追加するメソッドであり、このメソッドを用いて相関チェックエラーを追加する。以下に引数を示す。
- 第1引数:JavaBeanのプロパティ名
- 第2引数:メッセージのキー
- 第3引数:errorArgsは置換文字列
- 第4引数:デフォルトメッセージ
(3) アプリケーション共通のSpring設定ファイルの確認
相関入力チェッククラスの定義情報の追加を行う。
- “terasoluna-spring-rich-blank/webapps/WEB-INF/applicationContext.xml”を開き、以下の箇所に相関チェッククラスの設定を追加する。
<!-- ======================================== 入力チェック定義 --> ・・・略・・・ <!-- 相関入力チェッククラス --> <bean id="ageValidator" class="jp.terasoluna.rich.tutorial.service.validation.AgeValidator"> <property name="validatorFactory" ref="validatorFactory"/> </bean>
<property>要素に、validatorFactoryを指定することにより、相関入力チェック機能だけでなく単項目入力チェック機能も実装される。
(4) “tutorial-controller.xml”の編集
データベースアクセス機能に、相関チェックを呼び出す設定を追加する。
- “terasoluna-spring-rich-blank/webapps/WEB-INF/tutorial-controller.xml”を開き、以下の箇所に相関チェックの定義を追加する。
<!-- ======================================== コントローラ定義 --> ・・・略・・・ <!-- 2.4 データベースアクセス xml-BLogic-castor 定義 --> <bean name="/dbAccessController" parent="blogicXmlRequestCastorViewController" scope="prototype"> <property name="blogic" ref="dbAccessService" /> <!-- ここから --> <property name="validator" ref="ageValidator"/> <!-- ここまで --> </bean>
ref属性で指定するBeanIDは、(3)で定義したBeanIDを指定する。