2017-06-29 10 views
0

J'utilise la validation du bean 1.1, et je voudrais valider un bean (au niveau de la classe) et ajouter des commentaires à l'utilisateur pour plusieurs champs.Bean validation plusieurs nœuds de propriété

haut niveau que je veux atteindre (omis code pour la lisibilité)

@RequestCheck 
public class Request { 
    private String param1; 
    private String param2; 
    private String param3; 
} 

public class RequestCheckValidator implements ConstraintValidator<RequestCheck, Request> { 
    //... 
    public boolean isValid(final Request request, final ConstraintValidatorContext context) { 
     if (request.param1 != null || request.param2 != null || request.param3 != null) 
      context.disableDefaultConstraintViolation(); 
      final ConstraintViolationBuilder violationBuilder = context.buildConstraintViolationWithTemplate("There are missing parameters."); 
      if (request.param1 == null) { 
       valid = false; 
       violationBuilder.addPropertyNode("param1"); 
      } 
      if (request.param2() == null) { 
       valid = false; 
       violationBuilder.addPropertyNode("param2"); 
      } 
      if (request.param3() == null) { 
       valid = false; 
       violationBuilder.addPropertyNode("param3"); 
      } 
      violationBuilder.addConstraintViolation(); 
      //return ... 
     } 
    } 

Le problème est que l'ajout d'un deuxième addProperyNode("...") jette un nullpointer. Comment ajouter correctement un paramètre supplémentaire au retour lorsque la validation s'applique à la classe? Pour clearifier: J'ai besoin de cette annotation au niveau de la classe, car la validation dépend de la combinaison des champs. Ils ont besoin de tous être présents ou aucun d'eux ne doit être présent.

Merci d'avance!

+0

Pourquoi ne pas utiliser l'annotation juste simple pour les champs de haricots au printemps de validation? – Afridi

+0

Parce qu'ils dépendent les uns des autres. Certains champs doivent tous être présents ou aucun ne doit être présent. –

+0

La validation JSR3 de Spring prend en charge la validation croisée. Pas besoin de réinventer la roue. – StanislavL

Répondre

0

Ok c'était en fait assez facile, il vous suffit de créer un constructeur par infraction:

context.buildConstraintViolationWithTemplate("if a parameter is supplied, please provide all parametes. param1 is Missing") 
       .addPropertyNode("param1") 
       .addConstraintViolation();