JSR 303: come convalidare una collezione di oggetti annotati?
-
29-09-2019 - |
Domanda
E 'possibile convalidare una collezione di oggetti in JSR 303 -? Jave Bean Validation dove la raccolta in sé non ha annotazioni ma gli elementi contenuti all'interno do
Ad esempio, è possibile che ciò comporti una violazione del vincolo a causa di un nome nullo sulla seconda persona:
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);
Soluzione
Sì, basta aggiungere @Valid
alla collezione.
Ecco un esempio da Hibernate Validator di riferimento.
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Questo è comportamento standard JSR-303. Vedere la sezione 3.1.3 della spec .
Altri suggerimenti
Si può anche aggiungere @NotEmpty
alla collezione.
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
questo garantirà almeno un passeggero è presente e l'annotazione @Valid
assicura che ogni oggetto Person
viene convalidato
Si può naturalmente anche appena iterate sopra la lista e chiamare Validator.validate su ogni elemento. O mettere la lista in qualche chicco di involucro e annotare con @Valid. Estendere ArrayList per la convalida sembra sbagliato per me. Avete un particolare caso d'uso si vuole risolvere con questo? Se è così forse si può spiegare un po 'di più. Per rispondere alla tua domanda iniziale:
E 'possibile convalidare un collezione di oggetti in JSR 303 - Jave Bean Validation dove la raccolta di sé non ha alcuna annotazioni ma gli elementi contenuti all'interno di fare?
No
Ho scritto questo classe generica:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
Se si utilizza Jackson biblioteca per deserializzare JSON è possibile aggiungere annotazioni @JsonCreator
sul costruttore e Jackson si deserializzare automaticamente matrice JSON per oggetto wrapper.