JSR 303: Comment valider une collection d'objets annotés?
-
29-09-2019 - |
Question
Est-il possible de valider une collection d'objets dans JSR 303 - Jave Bean Validation où la collection elle-même n'a pas d'annotations, mais les éléments contenus dans do
Par exemple, est-il possible pour que cela résulte en une violation de contrainte due à un nom nul sur la deuxième personne:
List<Person> people = new ArrayList<Person>();
people.add(new Person("dave"));
people.add(new Person(null));
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<List<Person>>> validation = validator.validate(people);
La solution
Oui, il suffit d'ajouter @Valid
à la collection.
Voici un exemple de la mise en veille prolongée Validator Référence.
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Ceci est un comportement normal JSR-303. Voir la section 3.1.3 du spécifications .
Autres conseils
Vous, pouvez également ajouter @NotEmpty
à la collection.
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
ce qui garantira au moins un passager est présente, et l'annotation @Valid
garantit que chaque objet est validé Person
Vous pouvez bien sûr aussi que itérer sur la liste et appeler Validator.validate sur chaque élément. Ou mettre la liste dans une fève emballage et annoter avec @Valid. L'extension ArrayList pour la validation me semble erroné de. Avez-vous un cas d'utilisation particulière que vous voulez résoudre avec cela? Si oui, vous pouvez peut-être expliquer un peu plus. Pour répondre à votre question initiale:
Est-il possible de valider un collection d'objets dans JSR 303 - Jave Bean Validation où le collection elle-même n'a pas annotations, mais les éléments contenus à l'intérieur faire?
Non
J'ai écrit cette classe générique:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
Si vous utilisez la bibliothèque Jackson désérialiser JSON vous pouvez ajouter une annotation de @JsonCreator
sur le constructeur et Jackson automatiquement désérialiser tableau JSON pour objet wrapper.