Validationについて、単純な「必須チェック」や「文字数チェック」はできるんですが
「この項目が入っていた時、別のこの項目にも値がないとダメ」
といった、相関チェックが必要なケースって、やっぱりよくありますよね?
そんなん標準機能でないんかな~、ないなぁ~
という感じで調べてたら見つかったのが「カスタムValidation」。
簡単ではありますがその設定方法を残しておきます。
ざっくり手順:
◆src下(struts.xmlやlog4j.xmlとかあるところ)にvalidators.xmlを作成。
※xml内に標準的なvalidation(requireStringなど)もすべて含めないとダメらしい
※カスタムのクラスが存在しないなど、読めなかった場合はvalidationが全滅する(無効になる)ので注意
<validator name="required" ・・・とかです。
◆別途パッケージを作って(こちらではbiz.assets.admin.validator)任意のValidation用クラスを作成
(extends FieldValidatorSupport は必須)
今回はMyValidator.javaと命名することにします。
◆順番が前後してますが、Validation用クラス(MyValidator.java)ができたら
validators.xml内にカスタムValidationを定義します。
nameは適当でいいですが、後で指定しますので忘れないようにw
例:<validator name="myValidator" class="example.validator.MyValidator" />
◆abc(Action名)-validation.xmlにvalidators.xmlで定義した名前を組み込む
※今回はitem_nameという項目名(id)に対してmyValidator(validators.xmlで定義)を呼び出し
~一部抜粋~
<field name="item_name">
<field-validator type="myValidator">
<param name="secondFieldName">check_name</param>
<message>かすたむえらーです</message>
</field-validator>
</field>
paramについてですがMyValidator.java内で
secondFieldNameという変数を用意しgetter・setterを用意、
値取得対象の項目名を取得したら
Object secondValue = this.getFieldValue(secondFieldName, object);
で値を取ることができる感じです。
後の具体的なチェック処理はご自由に。
で、そのチェックに引っかかったら
addFieldError(fieldName, object);
でエラーオブジェクトに放り込んでおくこと。
そうしないとエラーなしという扱いになって処理が進んでしまいます。
(その他のエラーが無ければexecute()メソッドが実行される、という意味です)
◆で、アプリを実行してみるとValidationでMyValidator.javaを実行され、エラーになれば
Actionでinput扱いで返してくれる。
…という寸法です。
ちゃんと理解してる人ならあっという間にできてしまうんでしょうけど、
出来の悪い私にとっては内容を把握するまでに時間がかかります・・・orz
でも、これで内容は理解できたので、複雑なチェックでも対応はできるようになったと思います♪
mak-black.