Commons Validator は、引数の扱いに特徴がある。

Commons Validator はインタフェースの実装等を強制せず、
引数や戻り値を、メソッド側が自由に決めることができる。
そのため、既存の検証コードを簡単に利用しやすい。

でも、検証を実行するクラスは呼び出される側なので、
その引数を用意するのは呼び出す側である。
では、どのように引数が与えられるのだろうか。

自分のコードで Commons Validator を使う場合、
検証コードを呼び出す方法を制御できるのだが、
Struts では ValidatorForm が検証メソッドを呼び出すので、
独自ルールの実装者は、引数を自由に制御できない。

なので、どのような引数が渡されるかどうかは
ValidatorForm の実装に任されている。

さて、Commons Validator では、引数を型の FQCN で識別し、
特定の FQCN を持つ型の引数には特別な値が渡される。

・java.lang.Object
  検証対象の Form Beam
・org.apache.commons.validator.ValidatorAction
  ルール自身の <validator> 要素の設定を含むクラス
・org.apache.commons.validator.ValidatorResults
  検証結果を格納するための汎用クラス
・org.apache.commons.validator.Form
  検証対象の <form> 要素の設定を含むクラス
・org.apache.commons.validator.Field
  検証対象の <field> 要素の設定を含むクラス
・org.apache.commons.validator.Validator
  検証を呼び出すためのパラメータを含むクラス。
・java.util.Locale
  呼び出し元のロケールを含むクラス。

ValidatorForm もこの方式を踏襲しており、
追加で以下の FQCN を持つ型の引数に特殊な値が渡される。

・javax.servlet.ServletContext
  Web アプリケーションの属性や実行状態。
・javax.servlet.http.HttpServletRequest
  現在の HTTP 要求。
・org.apache.struts.action.ActionMessages
  検証結果のエラーメッセージの格納先。

Struts を使う場合は、以上の型のみ引数が渡され、
これ以外の型の引数には null が渡されるのである。

さて、メソッドはリフレクションを使って呼び出されるので、
クラスもメソッドも public として用意する必要があるが、
メソッドが静的である必要はない。

もし、インスタンスメソッドを使う場合は、
自動的にクラスのインスタンスが生成されるので、
引数なしの public コンストラクタを用意しておくこと。
この場合、検証実行前の初期化が可能となる。

メソッドの戻り値は厳密には既定されていないが、
メソッドが有効な値を返さなければならない場合、
成功時は適当な型のインスタンスで失敗時は null。
もし、メソッドの戻り値が不要であれば、
成功時は true、失敗時は false を返すべきである。