Javaライブラリ(Commons)Validator | Hello, Stupid World!

Hello, Stupid World!

いろいろとメモ代わりに書いていきます。

今回はCommons-Validatorです。
Commons-Validatorは汎用的なエラーチェック処理のライブラリです。

StrutsのVlidatorは内部でこれを使っているのでStruts経験者はどんな物か
分かると思います。
各種エラーチェック処理とエラーチェック処理対象、エラーメッセージを
xmlで指定できます。
これによってエラーチェック処理が一元化でき、作成修正が簡単になります。


「使い方」
以下の場所からダウンロードしてJarをビルドパスに加えましょう。

http://commons.apache.org/proper/commons-validator/download_validator.cgi

左のメニューのDependenciesというメニューを押すと依存しているアプリケーション
が表示されます。

今回落としたCommons-Validator 1.4では
commons-beanutils 1.8.3
commons-digester 1.8
commons-logging 1.1.1
が必要なのでそれらもビルドパスに。

「ソース例」

[validator-name-required.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
     "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN"
     "http://jakarta.apache.org/commons/dtds/validator_1_1.dtd">
   <global>
      <validator name="required"
         classname="NameValidator"
         method="validateRequired"
         methodParams="java.lang.Object, org.apache.commons.validator.Field"
         msg="required.field"/>
   </global>
   <formset>
      <form name="userInfo">
         <field property="name" depends="required">
            <arg0 key="userInfo.username.displayname"/>
         </field>
      </form>
   </formset>
</form-validation>

エラーチェック関連をまとめたxmlです。
globalタグのvalidatorがエラーチェックを行う要素です。

classname:クラス名
name:論理名
method:メソッド名
methodParams:メソッドの引数型
msg:エラー時に出力するメッセージ
エラーチェックを行うものがもっと必要ならば、その分validatorタグを
用意します。

下のformsetタグがエラーチェックの対象です。

formタグname:対象をひとめとめにした論理名
fieldタグproperty:チェック対象となるクラスのプロパティ(メンバ)
depends:使用したいvalidatorの論理名(複数可)

「NameValidator.java」
public class NameValidator {
public static boolean validateRequired(Object bean, Field field)
    {
        String value =
            ValidatorUtils.getValueAsString(bean, field.getProperty());
        boolean isNotBlankOrNull = !GenericValidator.isBlankOrNull(value);
        boolean isValidLength = GenericValidator.minLength(value, 4)
                                && GenericValidator.maxLength(value, 16);
        return isNotBlankOrNull && isValidLength;
    }
}
en → ja
( 17

エラーチェックを実際に行うValidatorです。
POJO(特定クラスを継承しなくてよい)です。
ここでは空白、Nullでなく4文字以上16文字以下のものを正常(True)としてます。
先ほどのvalidator-name-required.xmlに登録する必要があります。

エラーチェック&結果表示

public static void main(String[] args) { 
 ResourceBundle resource = ResourceBundle.getBundle(" applicationresource");

 Bean user = new Bean();
 user.setName("TTT");
 try {
 InputStream in = user.getClass().getResourceAsStream("validator-name-required.xml");
  ValidatorResources resources = new ValidatorResources(in);
  Validator validator = new Validator(resources, "userInfo");
  validator.setParameter(Validator.BEAN_PARAM, user);
  ValidatorResults results = validator.validate();

  // 検証結果を表示
  Set<?> propertyNames = results.getPropertyNames();
  for (Object propertyName: propertyNames) {
   ValidatorResult result = results.getValidatorResult((String)propertyName);
   Iterator<?> actions = result.getActions();
   while (actions.hasNext()) {
    String actionName = (String) actions.next();
    if (!result.isValid(actionName)) {
     ValidatorAction action = resources.getValidatorAction(actionName);
     System.out.println("ERROR: " + resource.getString(action.getMsg()
    }
   }
  }
 } catch (SAXException ex) {
  ex.printStackTrace();
 } catch (IOException ex) {
  ex.printStackTrace();
 } catch (ValidatorException ex) {
  ex.printStackTrace();
 };
}

説明すると
ValidatorResourcesでvalidatorの設定ファイルを読込み、validatorクラスを作成し
コンストラクタやsetParameterでvalidateの設定後、validete(エラーチェック)。

結果はValidatorResultで帰ってくる。
getPropertyNamesで各プロパティを取得する(filedタグのproperty)。
次にプロパティが行ったチェック(depands)の結果をgetActionsで取得し
isValideでエラーだったか見てエラーだった場合getMsgでメッセージ(msg)を取得。
メッセージはプロパティファイル(applicationresource)から検索して取ってくる。
という流れ

StrutsのValidatorに近い感じにしてみました。

「applicationResource.properties」
required.field=4文字以上16文字以下で入力して下さい

設定ファイルはこのようにキー=値という形式で入力します。

「実行結果」