10.妥当性チェックについて
概要
Spring MVCで使用している妥当性チェックは、Spring MVCに特化した機能ではありません。
通常のアプリケーションでも使用できるものを、WEBでも利用しているだけです。
ですので、ここではWEBに特化した内容を中心に扱います。
ちなみに、世の中のWEBで紹介されているサンプルではHibernate Validatorばかりがピックアップされていますが、
他のValidatorも使用できます。
参考: Spring Modules (ただし、SpringModulesは既に終了したプロジェクトのようですので使用は控えた方が良いかもです)
はじめに
妥当性チェックには、Binderを使用します。こちらの記事をまず読んでいただければと思います。
また、ここでは妥当性チェックについてのみ触れますので、全体のコードを見てみたい方はこちらをお勧めします。
ちなみにSpring MVCの場合、Hibernate Validatorがクラスパスに存在すれば、それがデフォルトのValidatorになり、
特に明示的な設定をしなくても使用されます。(このデフォルト処理は、LocalValidatorFactoryBeanクラスが担っています。)
【SpringのValidatorについて】
SpringのValidatorについて簡単に触れておきます。
Springで用意しているValidatorはインターフェースしか持っていません。
派生クラスが様々なValidatorフレームワークの橋渡しをするので、どのようなValidatorフレームワークも使用可能です。
自分で派生クラスを作成することも可能です。
Validatorの設定方法
設定のサンプル
設定方法は簡単です。
Controller内、もしくはグローバルなBinderの初期化処理で、setValidatorを呼び出すだけです。
Hibernate Validaorの場合はクラスパスにライブラリを置けばよいだけです。
それ以外のValidatorを使用する場合は以下のように明示的に設定します。
【サンプル】
@Autowired @Qualifier("formValidator")
private Validator validator;
@InitBinder("form")
public void initBinderForm(WebDataBinder binder) {
binder.setValidator(this.validator);
}
エラーメッセージの解決方法
バインドの結果として、型変換エラーや妥当性チェックエラーなどのエラーコードが返ってきます。
SpringMVCでは、エラーメッセージをWEB画面に表示する機構は用意されているので特にプログラマが意識する必要はないです。
しかし、内部での処理をある程度理解しておいた方が良いと思います。
エラーメッセージは、メッセージリソースからエラーコードをキーにして取得しています。
以下でメッセージリソース(message.properties)とエラーコードの記述を見てみましょう。
【message.propertiesファイルのサンプル】
#Spring typemismatch エラー
typeMismatch.int=数値を入力してください
typeMismatch.java.math.BigDecimal=数値を入力してください
typeMismatch.java.util.Date=日付を入力してください。
#妥当性チェック エラー
errors.required=必須です。
【型変換のエラーコード】
おおよそ以下のプレフィックスのルールがあります。
・フィールドが存在しないエラー: "required"
・型変換エラー : "typeMismatch"
・メソッド呼び出しエラー : "methodInvocation"
【妥当性チェックのエラーコード】
通常、妥当性チェックのエラーコードはプログラマーが作るか、妥当性チェックのフレームワークが自動で作ります。
例: "errors.required"
【エラーコードからメッセージ文字列への変換】
上記のエラーコードをメッセージに変換するのは、MessageCodesResolverというクラスが行います。
デフォルトでは、DefaultMessageCodesResolverというクラスが使われているはずです。
型変換のエラーコードも、妥当性チェックのエラーコードもこのクラスが解決しようとします。
このクラスがメッセージリソースのキー名を複数作り、それらのうちメッセージリソースから一番最初に見つかったキー名を採用します。
例えば、"errors.required.age", "errors.required.int", "errors.required" のようなキー名を生成します。
つまり、上記のエラーコード(例: "errors.required")に、プロパティ名や型名などをつけたキー名を生成します。
これらのことを考慮してメッセージリソースにエラーメッセージを設定すれば、より細かいエラーメッセージを生成できます。
ここでは特にこれ以上触れませんが、気になる方はJavadocをご覧になると良いかと思います。
参考: 81.参考: 妥当性チェックのエラーメッセージ出力方法
妥当性チェックを適用する方法
上記でValidatorを設定する方法を見ました。しかし、上記の設定をすれば妥当性チェックを実施してくれるわけではありません。
明示的に妥当性チェックするモデルを指定する必要があります。
なぜなら、妥当性チェックをしたくない対象も存在するからです。
設定は簡単で、チェックしたいモデルの引数に@Validアノテーションを付けるだけです。
【サンプル】
@RequestMapping(value="edit/confirm", method=RequestMethod.POST)
public String confirm(@Valid Form form, BindingResult result, @Valid Form2 form2, BindingResult result2) {
見ていただければだいたいわかるかと思います。
注意点としては、妥当性チェックの結果(BindingResult)はアノテーション引数のすぐ後に引数を置かないといけません。
もちろん、@Validは複数のモデルに対して指定可能です。
参考:他の妥当性チェック(Valang)を使用するサンプル
ここでは、Hibernate Validator以外の妥当性チェックの設定例も見てみましょう。
Valang自体はこちらの記事を参照ください。
Springの設定だけを見ます。
【Springの設定ファイル記述例】
<!-- Validator -->
<bean id="formValidator" class="org.springmodules.validation.valang.ValangValidator">
<property name="valang">
<value>
<![CDATA[
{ user.name : size(?) <= 5 : '名前は5文字以下です。' : 'errors.minlength': '名前',5 }
{ user.age : ? >= 10 : 年齢は5以下の数字です。' : 'errors.max': '年齢',10 }
]]>
</value>
</property>
</bean>
Controllerでの設定は上記の「Validatorの設定方法」のサンプルどおりです。
Created Date: 2012/04/07