Bean Validation(HibernateValidator)とm4hv-extensionsについて

前回はBean Validationの基本的な使い方について記事を書きましたが、今回はBeanValidationとその追加バリデーションライブラリであるm4hv-extensionsについて解説します。
m4hv-extensionsはBeanValidationの実装であるHibernateValidatorで動作確認を取っています。

m4hv-extensionsを利用するにはm4hv-extensions-X.X.X.jar(X.X.Xはバージョン:最新は1.4.1)を別途クラスパスに追加し、前回の記事で説明したValidationMessages.propertiesに以下のメッセージを追加する必要があります。

ValidationMessages.propertiesに追加するm4hv-extensions用メッセージ

## extensions messages.
org.maru.m4hv.extensions.AlphabetNumber.message=アルファベット、数字以外の文字が含まれています。
org.maru.m4hv.extensions.ActualDate.message=不正な日付です(有効な日付:{from}-{until})。
org.maru.m4hv.extensions.Hours.message=不正な時間です(有効な時間:{from}-{until})。
org.maru.m4hv.extensions.Minutes.message=不正な分です(有効な分:{from}-{until})。
org.maru.m4hv.extensions.Seconds.message=不正な秒です(有効な秒:{from}-{until})。
org.maru.m4hv.extensions.Time.message=不正な時刻です(有効な時刻:{from}-{until})。
org.maru.m4hv.extensions.ZipCode.message=郵便番号の形式が不正です。
org.maru.m4hv.extensions.Hiragana.message=平仮名ではありません。
org.maru.m4hv.extensions.Katakana.message=片仮名ではありません。
org.maru.m4hv.extensions.CharLength.message={min}文字以上{max}文字以下でなければなりません。
org.maru.m4hv.extensions.NumberString.message={min}桁以上{max}桁以下の数字文字列でなければなりません。
org.maru.m4hv.extensions.HalfwidthKatakana.message=半角片仮名ではありません。
org.maru.m4hv.extensions.NotHaveInValidCharacter.message=許可されていない文字を含んでいます。
org.maru.m4hv.extensions.OnlyHaveValidCharacter.message=有効な文字以外の文字を含んでいます。

上記メッセージはVersion1.4.1で利用可能なバリデーションメッセージであり、旧バージョンでは存在しないバリデーションメッセージも含んでいます。

HibernateValidatorには@Lengthというプロパティの文字列の長さをチェックするバリデーションがあります。

このバリデーションを利用することで例えば指定された長さ以上の文字列がプロパティに設定された場合バリデーションエラーとなります。

@Length(min = 5, max = 10)
private String field1;

上記例では5文字以上10文字以下の文字列ならば検査OKとなり、それ以外の長さの文字列の場合は検査NGとなります。

このバリデーションはアルファベットや数字を扱う上では問題ないのですが、例えば日本語の「ホッケ」という漢字などサロゲートペアや合成文字で構成される文字が含まれた場合正しく動作しません。これはString#lengthも同じです。上記プロパティにサロゲートペア文字を含めて見た目10文字の文字列を設定してみるとわかると思いますが、検査NGという結果になります。サロゲートペア1文字の文字列に対してlengthメソッドを呼び出すとわかると思いますが、結果は2となります。これはString#lengthメソッドが文字列長を計測するとき、文字ではなく文字コードで文字列長を計測していることを意味しています。

通常は入力チェックでそのような文字を禁止文字として扱うことが多いと思いますが、地名等でそのような漢字が存在する以上アプリケーションによってはどうしてもチェックを行いたいという局面もあるのではないでしょうか。

m4hv-extensionsではサロゲートペアや合成文字も1文字としてカウントするためのバリデーションがあります。@CharLengthがそれにあたります。@CharLengthバリデーションは自然な文字の区切りを認識しそれぞれを1文字としてカウントし文字列長の検査を行います。

@CharLength(min = 5, max = 10)
private String field1;

今度は@CharLengthが付与されたプロパティにサロゲートペア込の10文字を入力してみてください。検証結果は正常終了するはずです。

m4hv-extensionsはこのように、通常のBeanValidationにはない多国語(特に日本語)を意識した追加バリデーションライブラリとなっています。

次回はBeanValidation(HibernateValidatior)単体の機能について改めて解説しようと思います。

m4hv-extensionsについては興味のある方は以下のサイトを参照してください。

プロジェクトトップ:http://maru.sourceforge.jp/index.html
ドキュメントサイト:http://maru.sourceforge.jp/document_dog.html
ダウンロードサイト:http://sourceforge.jp/projects/maru/releases/