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);
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top