Frage

Ist es möglich, eine Sammlung von Objekten in JSR 303 zu validieren - Jave Bean Validation, wo die Sammlung selbst keine Anmerkungen hat, sondern die Elemente innerhalb do enthalten

Zum Beispiel ist es möglich, dass diese in einer Einschränkungsverletzung führen aufgrund eines Null Namen auf der zweiten Person:

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);
War es hilfreich?

Lösung

Ja, nur @Valid zur Sammlung hinzuzufügen.

Hier ist ein Beispiel aus die Hibernate Validator Referenz.

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

Das ist Standard JSR-303 Verhalten. Siehe Abschnitt 3.1.3 des spec .

Andere Tipps

Sie können auch @NotEmpty zur Sammlung hinzuzufügen.

public class Car {
  @NotEmpty(message="At least one passenger is required")
  @Valid
  private List<Person> passengers = new ArrayList<Person>();
}

Dies wird sicherstellen, mindestens einen Passagier anwesend ist, und die @Valid Annotation sichergestellt, dass jedes Objekt Person validiert

Sie können natürlich auch nur Iterierte über die Liste und rufen Validator.validate auf jedem Element. Oder legen Sie die Liste in eine Wrapper-Bohne und mit Anmerkungen versehen es mit @Valid. Arraylist für die Validierung erstreckt, scheint mir falsch. Haben Sie einen bestimmten Anwendungsfall Sie mit diesem lösen wollen? Wenn ja vielleicht können Sie es ein wenig mehr erklären. Zur Beantwortung Ihrer ersten Frage:

  

Ist es möglich, eine zu validieren   Sammlung von Objekten in JSR 303 -   Jave Bean Validation, wo die   Sammlung selbst hat keine   Anmerkungen aber die Elemente enthalten   innerhalb tun?

Nein

Ich schrieb diese generische Klasse:

public class ValidListWrapper<T> {

    @Valid
    private List<T> list;

    public ValidListWrapper(List<T> list) {
        this.list = list;
    }

    public List<T> getList() {
        return list;
    }

}

Wenn Sie Jackson-Bibliothek verwenden JSON deserialisieren Sie @JsonCreator Anmerkung auf den Konstruktor hinzufügen und Jackson wird automatisch JSON-Array Wrapper-Objekt deserialisieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top