/* * Copyright (c) 2007 NTT DATA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jp.terasoluna.fw.validation.springmodules; import org.springframework.validation.Errors; import org.springmodules.validation.commons.DefaultBeanValidator; /** * 相関チェックを行なう抽象クラス。 * * <p>Spring-Modules Validatorによる単項目チェック以外に相関にチェックを * 行ないたい場合に使用する。 * ただし、DBアクセスが必要なチェックは各業務クラスにてチェックすること。 * サブクラスは{@link #validateMultiField(Object, Errors)}メソッドを * オーバーライドし、チェックロジックを記述する。</p> * * <h5>サブクラスの実装例</h5> * * <p>サブクラスは{@link #validateMultiField(Object, Errors)}メソッドを * オーバーライドする。 * 引数のobjは検査対象のJavaBeanであるため、各JavaBeanの型にキャストしてから * 属性を取り出す。 * エラーを追加する場合、引数errorsのrejectメソッド、rejectValueメソッドを * 実行する。 </p> * * <pre> * protected void validateMultiField(Object obj, Errors errors) { * * // JavaBeanの取得 * SampleBean bean = (SampleBean) obj; * * // 1つ目の属性 * String field1 = bean.getField1(); * * // 2つ目の属性 * String field2 = bean.getField2(); * * // 1つ目の属性と2つ目の属性が同じではない場合、エラーを追加する * if (!field1.equals(field2) { * // エラーを追加する * errors.reject("errors.sample"); * } * } * </pre> * * <h5>Errorsインタフェースの代表的なエラー追加メソッド</h5> * * <table border="1"> * <tr> * <td><center><b>メソッド名</b></center></td> * <td><center><b>説明</b></center></td> * </tr> * * <tr> * <td>void rejectValue(String field, String errorCode)</center></td> * <td>エラーを追加する。fieldにはJavaBeanのプロパティ名、 * errorCodeにはリソースバンドルのキーを指定する。 * 置換文字列がないエラーに使用する。</td> * </tr> * <tr> * <td>void rejectValue(String field, String errorCode, Object[] errorArgs, * String defaultMessage)</center></td> * <td>エラーを追加する。field、errorCodeは上記と同様。errorArgsは置換文字列、 * defaultMessageはデフォルトメッセージを指定する。(Terasolunaでは * デフォルトメッセージは使用しないため、任意の文字列を設定する)</td> * </tr> * <tr> * <td>void reject(String errorCode)</center></td> * <td>エラーを追加する。リソースバンドルのキーのみ指定する。 * field情報を指定しない相関チェック等に使用する。</td> * </tr> * <tr> * <td>void reject(String errorCode, Object[] errorArgs, * String defaultMessage)</center></td> * <td>エラーを追加する。errorArgsは置換文字列、defaultMessageは * デフォルトメッセージを指定する。(Terasolunaでは * デフォルトメッセージは使用しないため、任意の文字列を設定する) * field情報を指定しない相関チェック等に使用する。</td> * </tr> * </table> * * <h5>Bean定義ファイルの記述例(入力チェッククラス)</h5> * * <p>Spring上でこの入力チェック機能を使用する場合、 * 入力チェックファクトリ(入力チェッククラスの初期化を行なうクラス)と * 入力チェッククラスをBean定義ファイルに設定する必要がある。</p> * <pre> * <!-- 入力チェッククラスのファクトリ --> * <bean id="validatorFactory" * class="org.springmodules.commons.validator.DefaultValidatorFactory"> * <property name="validationConfigLocations"> * <list> * <!-- ここに記述したバリデーション定義ファイル(validation.xml)や * バリデーションルール定義ファイル(validation-rules.xml)を * Springフレームワークが設定ファイルとして認識する --> * <value><b>/WEB-INF/validation/validator-rules.xml</b></value> * <value><b>/WEB-INF/validation/validator-rules-ex.xml</b></value> * <value><b>/WEB-INF/validation/validation.xml</b></value> * </list> * </property> * </bean> * * <!-- 相関チェックを行なう入力チェッククラス * class属性に作成した相関チェッククラスを記述する--> * <bean id="sampleValidator" <b>class="jp.terasoluna.sample2.validation.SampleMultiFieldValidator"</b>> * <property name="validatorFactory"><ref local="validatorFactory"/></property> * </bean> * </pre> * * <h5>Bean定義ファイルの記述例(コントローラ)</h5> * * <p>Bean定義ファイルで設定した入力チェック機能を使用するために、 * コントローラのvalidator属性に上記で設定した入力チェック機能を * 設定する必要がある。</p> * <pre> * <!-- サンプル入力チェック業務 --> * <bean name="/secure/blogic/validateSample.do" * class="jp.terasoluna.sample2.web.controller.ValidateSampleController" * parent="xmlRequestController"> * <property name="sumService" ref="sumService"/> * <property name=<b>"validator"</b> ref=<b>“sampleValidator"</b>/> * <property name="commandClass"> * <value>jp.terasoluna.sample2.dto.SampleDto</value> * </property> * </bean> * </pre> * * @see org.springmodules.validation.commons.DefaultBeanValidator * @see org.springframework.validation.BindException * @see org.springframework.validation.Errors */ public abstract class BaseMultiFieldValidator extends DefaultBeanValidator { /** * 入力チェックメソッド。 * 設定ファイルによる単項目チェックを呼び出し、 * エラーがなければ{@link #validateMultiField(Object, Errors)} * メソッドを呼び出す。 * * @param obj 検査対象のJavaBean * @param errors エラー */ @Override public void validate(Object obj, Errors errors) { // 設定ファイルによる単項目チェック super.validate(obj, errors); // エラーがなければ相関チェックを行なう if (!errors.hasErrors()) { validateMultiField(obj, errors); } } /** * 相関チェックを行なうメソッド。 * 単項目チェックでエラーが発生しない場合、呼び出される。 * サブクラスはこのメソッドを実装する * * @param obj 検査対象のJavaBean * @param errors エラー */ protected abstract void validateMultiField(Object obj, Errors errors); }