web-dev-qa-db-ja.com

JSR 303:注釈付きオブジェクトのコレクションを検証する方法は?

JSR 303-Jave Bean Validationでオブジェクトのコレクションを検証することは可能ですか?Jave Beanの検証では、コレクション自体に注釈はありませんが、含まれている要素には含まれていますか?

たとえば、2人目の名前がnullであるために、これにより制約違反が発生する可能性があります。

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

はい、追加するだけで@Validコレクションに。

Hibernate Validator Referenceの です。

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

これは標準のJSR-303の動作です。 spec のセクション3.1.3を参照してください。

61
sourcedelica

また、@NotEmptyをコレクションに追加することもできます。

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

これにより、少なくとも1人の乗客が存在し、@Validアノテーションにより、各Personオブジェクトが検証されます。

20
dezzer10

もちろん、リストを繰り返し処理して、各要素でValidator.validateを呼び出すこともできます。または、リストをラッパーBeanに入れて、@ Validで注釈を付けます。検証のためにArrayListを拡張することは、私には間違っているようです。これで解決したい特定のユースケースはありますか?もしそうなら、もう少し説明できるかもしれません。最初の質問に答えるには:

JSR 303-Jave Bean Validationでオブジェクトのコレクションを検証することは可能ですか?Jave Beanの検証では、コレクション自体に注釈はありませんが、含まれている要素には含まれていますか?

番号

2
Hardy

この汎用クラスを作成しました。

public class ValidListWrapper<T> {

    @Valid
    private List<T> list;

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

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

}

Jacksonライブラリを使用してJSONを逆シリアル化する場合は、@JsonCreatorコンストラクターの注釈とJacksonは、JSON配列をラッパーオブジェクトに自動的に逆シリアル化します。

0
holmis83