Commons Validatorによる妥当性チェック
概要
Spring Modulesが提供するCommons Validator方式の妥当性チェックについて簡単に見ていきます。
これからサンプルと見ていくと、Commons Validator自体はStrutsでも使用されているため、Strutsを使用していた方には馴染みがあるやり方に見えると思います。
しかし、基本は同じですが一部違う部分もありますので注意が必要です。
StrutsではActionFormをCommons Validatorで使用できるように拡張しています。ですので、Strutsの場合は、DynaBeanに対しても妥当性チェックすることが可能です。
DynaBeanは、Apache Commonのクラスの1つですが、Strutsはこのクラスを裏でラップすることでさまざまなクラスを妥当性チェック可能にしているのです。
また、validator.xmlファイルの書き方においても、日付の妥当性チェックの記法が違ったりしています。
基礎知識としてこのあたりを頭の片すみにおいておくと、トラブル時にスムーズに対処できると思います。
さて、前置きが長くなりましたが実際にサンプル見てみます。
使用サンプル
<準備>
SpringModulesのホームページからjarファイルをダウンロードしてください。
⇒ https://springmodules.dev.java.net/
ダウンロードしたじzipから以下のファイルを取り出してプロジェクトに配置してください。
spring-modules-0.9-all.jar (zip直下にあるはずです)
validator-rules.xml (サンプルの中にあるはずです)
<サンプルファイル: validator.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 ">
<form-validation>
<formset>
<form name="Member">
<!-- 必須チェック -->
<field property="id" depends="required,integer">
<arg0 key="ID" resource="false" />
</field>
<!-- 桁数チェック -->
<field property="name" depends="maxlength, integer">
<arg0 key="名前" resource="false" />
<arg1 key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>1</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
<サンプルクラス: Member.java>
妥当性チェックの対象クラスです。このクラスを妥当性チェックをします。
public class Member {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<サンプルSpring設定ファイル: applicationContext.xml>
Spring設定ファイルでの記述例です。
validatorFactoryで、ロードする設定ファイルのパスを指定しています。
"classpath:/com/sample/validator.xml"のようにクラスパスからロードするように指定することもできます。
<!--validator で読み込む設定ファイルを指定します(以下はWebの場合) -->
<bean id="validatorFactory" class="org.springmodules.validation.commons.DefaultValidatorFactory">
<property name="validationConfigLocations">
<list>
<value>/WEB-INF/validator-rules.xml</value>
<value>/WEB-INF/validator.xml</value>
</list>
</property>
</bean>
<bean id="beanValidator" class="org.springmodules.validation.commons.DefaultBeanValidator">
<property name="validatorFactory" ref="validatorFactory"/>
</bean>
もし、WebのSpringMVCで使用したい場合は、上記に加えて以下のように設定します。
<!--
メッセージリソースの設定。
-->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
<!-- サンプルController -->
<bean id="validatorTestInputController" class="org.springframework.web.servlet.mvc.SimpleFormController">
<property name="commandClass" value="business.domain.CmdTest" />
<property name="formView" value="/WEB-INF/jsp/input.jsp" />
<property name="successView" value="/WEB-INF/jsp/output.jsp" />
<property name="validator" ref="beanValidator"/>
</bean>
<サンプルコード: 妥当性チェックを行う>
Webの場合は、上記のControllerの例のようにSpringに設定するだけで自動的に妥当性チェックが行われるので、わざわざ妥当性チェックのコードを記述する必要がありません。
それ以外の場合は自分でコードを記述する必要があります。
おおよそ以下のようなコードになります。
【自作コード上で妥当性チェックを行う例】
Member mem = new Member();
mem.setId(10000);
mem.setName("あいうえお");
BindException errors = new BindException(mem, "member");
Validator validator =(Validator)applicationContext.getBean("beanValidator");
validator.validate(mem, errors);
System.out.println(errors);
実行結果例は以下の感じです。
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'member' on field 'name': rejected value [あいうえお]; codes [errors.maxlength.member.name,errors.maxlength.name,errors.maxlength.java.lang.String,errors.maxlength]; arguments [名前,1]; default message [errors.maxlength]
⇒このエラーコードをメッセージに変換する方法は以下を参照ください。
参考: 81.参考: 妥当性チェックのエラーメッセージ出力方法
型変換エラー
これはCommons Validtorだけの問題ではありませんが、POJOにsetterで値を設定するときの型変換エラーを
捕捉したいときがあります。
実は型変換エラーの補足は、SpringのValidatorの仕事ではありません。
通常は、SpringはBinderと呼ばれる機能で型変換を行いますので、型変換エラーの補足もBinderの仕事です。
参考: 09.Binderの初期化について (パラメタからモデルへの型変換)
⇒これはSpring MVCの記事ですが、通常のBinderに関する情報も記述しています。
ちなみにBinderにはValidatorを設定することもでき、POJOに値を設定するときに妥当性チェックを行うこともできます。
弱点
Spring Modulesでは思想的に「アプリケーション内ではPOJOを使用する」ことを前提に置いた機能になっています。
Commons Validatorもその思想を受け継いでいます。つまりMapやDynaBeanに対して妥当性チェックができません。
以下は、このことも含めた自分が考える個人的見解による弱点です。
・POJO(setter/getterのあるもの)をデータの保存先にすることは普通ですので、これが制約になることは滅多にないと思います。
しかし、小さなアプリを作成したい場合やほんの一時的にしか使用しないようなデータまでPOJOにするのは大変です。
できればMapやDynaBeanを使用したいです。
このあたりの弱点は、soracaneの部品を使用すれば解決します。
Created Date: 2010/01/27