6

JSR-303 の仕様を読む:

制約検証実装インスタンスのライフサイクルは未定義です

初期化メソッドは、制約の実装を使用する前に、Bean 検証プロバイダーによって呼び出されます。

isValid メソッドは、指定された値が検証されるたびに Bean Validation プロバイダーによって評価されます。値が有効でない場合は false を返し、そうでない場合は true を返します。isValid の実装はスレッドセーフでなければなりません。

私はそれを完全に理解することはできません。initializeは各isValid呼び出しの前に呼び出され、isValidはスレッドセーフである必要がありますか? 後でisValidからアクセスするために初期化でクラスレベルに何も格納できないということですか? 特に、 initializeに渡される注釈インスタンスが必要です。

誰かがそれに光を当てることができますか?

4

3 に答える 3

4

initialize()の各呼び出しの前にそれを呼び出す必要があるとは言いませんisValid()isValid()同じ注釈に対して を複数回呼び出す前に、一度だけ呼び出すことができます。たとえば、その javadocは次のように述べています。

isValid呼び出しに備えてバリデーターを初期化します。

于 2012-04-11T14:56:07.663 に答える
3

このinitialize()メソッドは制約ごとに 1 回isValid()呼び出されますが、 は制約の検証ごとに呼び出されます。

に渡されたアノテーション (またはその単一の属性) をisValid()バリデーターのフィールドに格納し、後で からアクセスすることはまったく問題ありませんisValid()Hibernate Validatorリファレンス ガイドで例を見つけることができます。

isValid()メソッドが複数のスレッドによって並行して呼び出される可能性があることを確認する必要があるだけです(たとえば、isValid()同期せずに内部からバリデーターの状態を変更することはできません)。

于 2012-04-12T20:43:57.073 に答える