JSR 303: Wie Validate eine Sammlung von kommentierten Objekte?
-
29-09-2019 - |
Frage
Ist es möglich, eine Sammlung von Objekten in JSR 303 zu validieren - Jave Bean Validation, wo die Sammlung selbst keine Anmerkungen hat, sondern die Elemente innerhalb do enthalten
Zum Beispiel ist es möglich, dass diese in einer Einschränkungsverletzung führen aufgrund eines Null Namen auf der zweiten Person:
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);
Lösung
Ja, nur @Valid
zur Sammlung hinzuzufügen.
Hier ist ein Beispiel aus die Hibernate Validator Referenz.
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Das ist Standard JSR-303 Verhalten. Siehe Abschnitt 3.1.3 des spec .
Andere Tipps
Sie können auch @NotEmpty
zur Sammlung hinzuzufügen.
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Dies wird sicherstellen, mindestens einen Passagier anwesend ist, und die @Valid
Annotation sichergestellt, dass jedes Objekt Person
validiert
Sie können natürlich auch nur Iterierte über die Liste und rufen Validator.validate auf jedem Element. Oder legen Sie die Liste in eine Wrapper-Bohne und mit Anmerkungen versehen es mit @Valid. Arraylist für die Validierung erstreckt, scheint mir falsch. Haben Sie einen bestimmten Anwendungsfall Sie mit diesem lösen wollen? Wenn ja vielleicht können Sie es ein wenig mehr erklären. Zur Beantwortung Ihrer ersten Frage:
Ist es möglich, eine zu validieren Sammlung von Objekten in JSR 303 - Jave Bean Validation, wo die Sammlung selbst hat keine Anmerkungen aber die Elemente enthalten innerhalb tun?
Nein
Ich schrieb diese generische Klasse:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
Wenn Sie Jackson-Bibliothek verwenden JSON deserialisieren Sie @JsonCreator
Anmerkung auf den Konstruktor hinzufügen und Jackson wird automatisch JSON-Array Wrapper-Objekt deserialisieren.