2016-02-10 4 views
0

J'écris des validations pour une classe où je spécifie le message d'erreur. Un membre est une liste <> d'objets d'une autre classe qui a également des validations. Je voudrais valider chaque objet de cette liste afin que la liste des violations retournée par ovale ait l'information nécessaire.Valider les objets d'une liste en utilisant OVal

Exemple:

class A{ 
    @AssertValid 
    List<B> items; 
} 

class B{ 
    @NotNull(message="ID can't be null") 
    Integer id; 
} 

Maintenant, supposons que dans mon principal que j'ai ceci:

A obj = new A(); 
List<B> items = new ArrayList<>(); 
items.add(new B()); 
a.setItems(items); 
List<ConstraintViolation> violations = validator.validate(obj); 
if(violations.size()>0) { 
    System.out.println(violations.get(0).getMessage()); 
} 

Ce qu'il imprime est "enet.sf.oval.constraint.AssertValid: com.A is invalid", au lieu de "ID Can't be null".

Y at-il une option à spécifier à OVal pour valider chaque élément au lieu de la liste dans son ensemble?

Merci

Répondre

0

Vous pouvez le faire en utilisant votre propre MessageFormatter:

public class CustomMessageValueFormatter implements MessageValueFormatter { 
    public static final CustomMessageValueFormatter INSTANCE = new CustomMessageValueFormatter(); 

    @Override 
    public String format(Object value) { 
     Validator validator = new Validator(); 
     List<ConstraintViolation> constraintViolations = validator.validate(value); 
     List<String> errorMessages = new ArrayList<>(); 
     constraintViolations.forEach(v -> errorMessages.add(v.getMessage())); 
     return errorMessages.isEmpty() ? value.toString() : errorMessages.toString(); 
    } 
} 

class A{ 
    @AssertValid(message = "{invalidValue}") 
    List<B> items; 
} 

class B{ 
    @NotNull(message="ID can't be null") 
    Integer id; 
} 

Et avant de valider définir votre MessageFormatter personnalisé comme:

Validator.setMessageValueFormatter(CustomMessageValueFormatter.INSTANCE); 
0

OVALE fait valider les éléments de la liste par défaut. Les détails de violation sont disponibles via ConstraintsViolatedException#getConstraintViolations().

Les objets ConstraintViolation résultants ont une méthode getCauses() qui vous permet de récupérer des détails sur les violations en cascade (c'est-à-dire les violations d'objets enfants).