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の添付ファイルを保管しました... ダウンロード