Valangによる妥当性チェック

概要

Spring Modulesが提供するValang方式の妥当性チェックについて簡単に見ていきます。

Valangの存在を初めて知る方もいらっしゃるかと思います。慣れると簡単です。

特徴としては、Spring設定ファイル上だけで妥当性チェックの内容を記述できることです。

Commons Validatorの場合は、validator-rules.xmlとvalidator.xml の2つのファイルが必要でした。

チェックの内容は、Spring独自のValang式で記述します。

以下のような感じです。

{ name : ? IS NOT NULLL AND size(?) <= 5 : '名前は5文字以下です。' : 'errors.maxlength' }

前置きはこれくらいにして、これから実際の設定サンプルを見てみましょう。

【注意点】

tomcatのライブラリservlet-api.jar をビルド・パスに追加しておいてください。

どうも、Valangでimportしているクラスの中にこのライブラリのクラスがあるようです。本当は必要ないかと思いますのでバグではないかと思います。

WEBを使用する場合は、tomcat自体がこのライブラリを用意しているのでimportする必要も意識する必要もありません。

使用サンプル

<準備>

SpringModulesのホームページからjarファイルをダウンロードしてください。

https://springmodules.dev.java.net/

また、tomcatライブラリのservlet-api.jarをビルド・パスに追加してください。

ここでの説明のSpringModulesのバージョンでは、tomcatのクラスをimportするようにソースが作られてしまっています。

将来、修正されるとは思いますが、とりあえずビルド・パスを通してください。

<サンプル: applicationContext.xml>

Valangによる妥当性チェックのサンプルは以下のとおりです。

<!-- 妥当性チェックするクラス -->

<bean id="beanValidator" class="org.springmodules.validation.valang.ValangValidator">

<property name="valang">

<value>

<![CDATA[

{ name : size(?) < 5: '名前は5文字以下です。' : 'errors.maxlength': '名前',5 }

]]>

</value>

</property>

</bean>

Valangの{ }内の書式は以下のとおりです。

{フィールド名 : valag式 : デフォルトメッセージ : メッセージコード : メッセージ引数}

<その他>

検査対象のクラスや妥当性チェックの利用の仕方はCommonsValidatorの場合とサンプルは同じになります。

こちらのページを参照してサンプルを完成させてください。

参考にする記事:

・Member.java

・applicationContext.xmlのメッセージリソースの設定、サンプルController

・妥当性チェックを行う

Commons ValidatorもValangもValidatorのinterfaceは同じなので、交換可能になっています。

ですので上記のように同じサンプルで置き換えができるのです。

独自Valang関数を追加する方法

独自のValang関数を追加するのは簡単です。

①AbstractFunctionクラスを継承して実装を作ります。

パッケージ名まで含めたクラス名はorg.springmodules.validation.valang.functions.AbstractFunctionです。

② Spring設定ファイル上で、以下のように記述します。これでどこでもValang式を使用するときに独自関数を呼び出せます。

<bean class="org.springmodules.validation.valang.functions.FunctionDefinition"

p:name="関数名"

p:className="独自関数クラスのパッケージまで含めたクラス名" />

もしくは、Validatorに毎回設定する方法もあります。この方法だと、設定したValidator内でしか関数が有効にならないようです。

弱点

Spring Modulesでは思想的に「アプリケーション内ではPOJOを使用する」ことを前提に置いた機能になっています。

つまりMapやDynaBeanに対して妥当性チェックができません。

ただし、DynaBeanにはgetMap()というメソッドがあり、これを使用すると map[name] のようにフィールドを指定して妥当性チェックができます。

以下は、このことも含めた自分が考える個人的見解における弱点です。

・文字列を数値に変換するValang関数が用意されていません。

基本的にそれほど多くの関数が用意されていません。

・POJOのプロパティ(getterの返り値)は型を持っています。

CommonsValidatorで記述したものと同じ弱点があります。

・関数の入れ子ができないようです。

例えば、数値に変換する関数number()を作り、div(number(?), 3) のようにネストした使い方をしたい場合があるかと思います。

Valangではこうした使い方はできないようです。

入れ子の問題以外は、soracaneの部品を使用すれば解決します。

Created Date: 2010/01/28