Question

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 contenus dans do

Par exemple, est-il possible pour que cela résulte en une violation de contrainte due à 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);
Était-ce utile?

La solution

Oui, il suffit d'ajouter @Valid à la collection.

Voici un exemple de la mise en veille prolongée Validator Référence.

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

Ceci est un comportement normal JSR-303. Voir la section 3.1.3 du spécifications .

Autres conseils

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

ce qui garantira au moins un passager est présente, et l'annotation @Valid garantit que chaque objet est validé Person

Vous pouvez bien sûr aussi que itérer sur la liste et appeler Validator.validate sur chaque élément. Ou mettre la liste dans une fève emballage et annoter avec @Valid. L'extension ArrayList pour la validation me semble erroné de. Avez-vous un cas d'utilisation particulière que vous voulez résoudre avec cela? Si oui, vous pouvez peut-être expliquer un peu plus. Pour répondre à votre question initiale:

  

Est-il possible de valider un   collection d'objets dans JSR 303 -   Jave Bean Validation où le   collection elle-même n'a pas   annotations, mais les éléments contenus   à l'intérieur faire?

Non

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top