2012-04-11 2 views
3

Lecture de la spécification JSR-303:Concurrency dans la validation de haricot

Le cycle de vie d'une instance de validation contrainte de mise en œuvre est définie

La méthode initialize est appelée par le fournisseur de validation Bean avant toute utilisation de l'implémentation de la contrainte.

La méthode isValid est évaluée par le fournisseur de validation du bean chaque fois qu'une valeur donnée est validée. Il renvoie false si la valeur n'est pas valide, true sinon. Les implémentations isValid doivent être thread-safe.

Je ne peux pas tout à fait le comprendre. initialiser est appelée avant chaque appel isValid et isValid doit être thread-safe? Est-ce que cela signifie que je ne peux pas stocker quelque chose au niveau de la classe dans initialize pour y accéder plus tard de isValid? Spécialement j'ai besoin de l'instance d'annotation qui est passée à initialize.

Quelqu'un peut-il faire la lumière s'il vous plaît?

Répondre

4

Il ne dit pas que initialize() doit être appelé avant chaque appel de isValid(). Il ne peut être appelé qu'une seule fois avant plusieurs appels de isValid() pour la même annotation. Par exemple, its javadoc dit:

Initialiser le validateur en préparation de isValid appelle.

+0

il dit «avant toute utilisation» cela ne signifie-t-il pas? – Arash

+0

@Arash: Pour autant que je sache "avant toute utilisation" ne signifie pas "avant chaque utilisation", cela signifie qu'aucune utilisation d'instance non initialisée n'est autorisée. – axtavt

3

La méthode initialize() est appelée une fois pour chaque contrainte, alors que isValid() est appelée pour chaque validation d'une contrainte.

Il est parfaitement possible de stocker l'annotation (ou les attributs uniques) passée à isValid() dans un champ du validateur et d'y accéder par la suite à partir de isValid(). Vous pouvez trouver un exemple dans le guide de référence Hibernate Validator.

Vous devez juste vous assurer que votre méthode isValid() peut être invocable par plusieurs threads en parallèle (par exemple, vous ne pouvez pas modifier l'état de votre validateur depuis isValid() sans synchronisation).