2010-11-05 18 views
39

E 'possibile convalidare una collezione di oggetti in JSR 303 - Convalida del bean Jave dove la raccolta stessa non ha annotazioni ma gli elementi contenuti all'interno fanno?JSR 303: Come convalidare una raccolta di oggetti annotati?

Ad esempio, è possibile che questo risultato in una violazione di vincolo a causa di un nome Null 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); 

risposta

55

Sì, basta aggiungere @Valid alla collezione.

Qui è an example dal riferimento del validatore di ibernazione.

public class Car { 
    @NotNull 
    @Valid 
    private List<Person> passengers = new ArrayList<Person>(); 
} 

Questo è il comportamento standard JSR-303. Vedere la Sezione 3.1.3 di spec.

+0

ok fantastico, molto meglio! – cam

+0

Suppongo che in questo caso la convalida @NotNull valuterà sia che l'elenco di pasenger non sia nullo e che la Persona in ogni elemento dell'array non sia Null. Non è vero? – borjab

+0

No ... vedere https://stackoverflow.com/questions/27984137/java-beans-validation-collection-map-does-not-contain-nulls – Archie

2

Ovviamente si può anche appena iterare l'elenco e chiamare Validator.validate su ogni elemento. Oppure metti la lista in un bean wrapper e annotala con @Valid. Estendere ArrayList per la convalida mi sembra sbagliato. Hai un particolare caso d'uso che vuoi risolvere con questo? Se è così forse puoi spiegarlo un po 'di più. Per rispondere alla tua domanda iniziale:

E 'possibile convalidare una collezione di oggetti in JSR 303 - Jave Bean Validation dove la raccolta sé non ha alcun annotazioni, ma gli elementi contenuti all'interno do?

No

+0

Sto usando JAX-RS e ho un elenco json di oggetti che analizzo in un elenco di java bean. Non ho un oggetto wrapper per la lista, quindi nessuna proprietà da annotare ... ho pensato che se questo fosse un problema generale nel non avere un bean wrapping, invece di creare un nuovo wrapper per ogni tipo di lista potrebbe essere più semplice semplicemente annotare una sottoclasse di lista generica.Penso che questo sarebbe anche possibile con un bean wrapping generico come suggerito, ad esempio: public class ValidatableListBean > { @Valid elenco T privato; } – cam

+0

In realtà, forse quella classe avrebbe più simile a questo: public class ValidatableBeanList { @Valid Lista privato lista; } – cam

+0

ValidatableBeanList sembra ragionevole per il tuo caso. – Hardy

17

Tu, puoi anche aggiungere @NotEmpty alla raccolta.

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

0

ho scritto questa 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 libreria per deserializzare JSON è possibile aggiungere l'annotazione sul costruttore e Jackson deserializzerà automaticamente l'array JSON sull'oggetto wrapper.

Problemi correlati