2013-03-03 3 views
0

Je suis un grand fan de JSR 303 BV mais dans mon projet actuel j'ai beaucoup de "validation dépendant du contexte" et je ne trouve aucune approche raisonnable pour les implémenter avec BV. Fondamentalement, les règles de validation peuvent dépendrevalidation dépendant du contexte pour BeanValidation

  • utilisateur connecté (il est stocké dans la demande http)
  • un utilisateur d'agir sur - l'identifiant de l'utilisateur est le chemin PARAM URL REST comme/foo/bar/utilisateur/1/STH
  • ces deux

Un petit exemple:

class Alphabet{ 
@Valid 
private Alpha a; 
@Valid 
private Beta b; 
@Valid 
private Gamma g; 
} 

Et validati en règle: Si l'utilisateur dont l'identifiant est fourni dans l'URL a le rôle "admin", aucune des propriétés "a", "b", "g" ne peut être nulle. S'il a le rôle "utilisateur", seul "a" ne doit pas être nul et les autres accessoires doivent être null. Donc, fondamentalement, ce type de règles peut facilement être implémenté en tant que contrainte de niveau classe de la classe Alphabet, mais un validateur personnalisé nécessiterait en quelque sorte un identifiant d'accès de l'utilisateur fourni dans l'URL. Y a-t-il un moyen intelligent d'y parvenir ou je dois forcer tous les clients REST à passer plusieurs fois l'identifiant de l'utilisateur: dans l'URL et dans la charge utile afin que ce dernier ne soit utilisé que par BV. Le cas le plus complexe se présente lorsque la règle de validation dépend de l'utilisateur connecté. Les valideurs personnalisés doivent donc accéder à un principal authentifié - à partir de ThreadLocal ou de HttpServletRequest.

Répondre

2

Vous pouvez utiliser validation groups:

//Define validation groups 
interface AdminChecks {} 
interface UserChecks {} 

//Assign the constraints to the two groups 
class Alphabet{ 

    @NotNull(groups={AdminChecks.class, UserChecks.class}) 
    private Alpha a; 

    @NotNull(groups=AdminChecks.class) 
    @Null(groups=UserChecksChecks.class) 
    private Beta b; 

    @NotNull(groups=AdminChecks.class) 
    @Null(groups=UserChecksChecks.class) 
    private Gamma g; 
} 

Selon le rôle de l'utilisateur actuel, vous spécifiez alors soit AdminChecks ou UserChecks lors de l'appel du validateur, par exemple comme ceci pour les contrôles admin:

Validator validator = ...; 
Set<ConstraintViolation<Alphabet>> violations = validator.validate(
    new Alphabet(), 
    AdminChecks.class 
); 
+0

Thx Gunnar pour la réponse. J'ai trop simplifié mon exemple. La vraie règle de validation est la suivante: si l'utilisateur est invité et appartient à un groupe de travail interdisant le changement de gamma pour les invités, la propriété gamma doit être nulle mais si le groupe de travail autorise des changements de gamma . Les règles similaires s'appliquent aux propriétés Beta, Alpha et autres. Toutes ces propriétés sont indépendantes - vous pouvez avoir des groupes de travail qui permettent à la fois gamma et bêta pour les invités mais interdisent alpha - toute combinaison possible. Je ne peux pas le modéliser avec des groupes de validation et utiliser des contraintes de niveau classe – user62058

Questions connexes