[Wicket-ja-user 595] Re: 一つのコンポーネントに複数の validator を add した場合の挙動について

アーカイブの一覧に戻る

Tsutomu YANO t_yano****@me*****
2011年 11月 21日 (月) 23:26:59 JST


矢野です。
私の書いた文章なので、調べてみました。

結論から書くと、私の文章が間違ってます。すみません。

一応、本のベースとなっている1.4-rc2と、1.3.1まで見てみましたが、validateValidators()の実装は変わっておらず、この実装であるかぎり、最初のバリデータでエラーになると、そこでチェックは打ち切られます。

> 			for (i = 0; i < size; i++)
> 			{
> 				validator = validators_get(i);
> 
> 				if (isNull == false || validator instanceof INullAcceptingValidator<?>)
> 				{
> 					validator.validate(validatable);
> 				}
> 				if (!isValid())
> 				{
> 					break;
> 				}
> 			}

FormComponent#validateValidators()のこの部分で、ループ末尾で毎回isValid()を呼び出しており、このisValidは、コンポーネントにエラーメッセージが登録されていると偽になりますので、バリデータがエラーを登録した直後に break します。

> 1.Wicketの仕様が途中で変わったのでしょうか。(私が使用したバージョンは1.4.19)
>  それとも何か私が勘違いしているのでしょうか。

いいえ。Wicketの仕様は変わっておらず、私の文章が誤っています。
できればどこかに記載しておきたいですが、エラッタなどが載らない感じなので、自前でどこかに載せるしかないですね…

> 2.コンポーネントに登録されたバリデータについて、後続のバリデータも実行したい場
> 合はどのようにするのが良いでしょうか。
>  「複数のチェックを行ないたい場合は、複数のチェックを行う単一のバリデータを作
> 成する」となるのでしょうか。


これを実現するための実装は標準にはないようですので、CompoundValidatorのソースを複写するなどして、validateメソッドの実装を、全バリデータを確実にループするように書き換えれば、汎用的に利用できる全チェックバリデータにできそうです。

このような感じで、元のソースでwhile文についていた「 && validatable.isValid()」を外すだけで、大丈夫かと思います。

	public final void validate(IValidatable<T> validatable)
	{
		Iterator<IValidator<T>> it = validators.iterator();
		while (it.hasNext())
		{
			it.next().validate(validatable);
		}
	}

以上です。

---------------------------------------------------
矢野 勉(やの つとむ)
電子メール: t_yano****@me*****
---------------------------------------------------

-------------- next part --------------
HTMLの添付ファイルを保管しました...
ダウンロード 



Wicket-ja-user メーリングリストの案内
アーカイブの一覧に戻る