web-dev-qa-db-fra.com

JSR 303: Comment valider une collection d'objets annotés?

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 qu'elle contient?

Par exemple, est-il possible que cela entraîne une violation de contrainte en raison d'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);
44
cam

Oui, ajoutez simplement @Valid à la collection.

Voici n exemple de la référence du validateur Hibernate.

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

Il s'agit du comportement standard du JSR-303. Voir la section 3.1.3 du spec .

61
sourcedelica

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>();
}

cela garantira la présence d'au moins un passager et le @Valid l'annotation garantit que chaque Person objet est validé

20
dezzer10

Vous pouvez bien sûr également simplement parcourir la liste et appeler Validator.validate sur chaque élément. Ou mettez la liste dans un bean wrapper et annotez-la avec @Valid. L'extension d'ArrayList pour la validation me semble erronée. Avez-vous un cas d'utilisation particulier que vous souhaitez résoudre avec cela? Si oui, vous pouvez peut-être l'expliquer un peu plus. Pour répondre à votre question initiale:

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 qu'elle contient?

Non

2
Hardy

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 pour désérialiser JSON, vous pouvez ajouter @JsonCreator annotation sur le constructeur et Jackson désérialise automatiquement le tableau JSON en objet wrapper.

0
holmis83