20

javax.validation API に困惑しています。私はそれを理解するための簡単なテストを書いています:

Sample sample = new Sample();
Set<ConstraintViolation<Sample>> violations = validator.validate(sample);
if (!violations.isEmpty()) {
    // Eclipse refuses to let me use my violations variable
    throw new ConstraintViolationException(violations);
}

例外コンストラクターで使用できるように、一連の違反を宣言するにはどうすればよいですか?

4

2 に答える 2

16

あなたはこのようにこれを回避することができます:

throw new ConstraintViolationException(
    new HashSet<ConstraintViolation<?>>(violations));

この問題に対処するBVAL-198の追跡に興味があるかもしれません。

于 2012-08-23T20:09:19.593 に答える
1

これは、Bean Validation 1.0 の既知のユーザビリティの問題です。この問題は、問題BVAL-198「ConstraintViolationExceptions の作成を簡素化する」によって、 Bean Validation 1.1で対処されました。Bean Validation 1.1 以降にアップグレードすると、コードを記述どおりにコンパイルできます。

具体的な問題は、ConstraintViolationExceptionコンストラクターSet<ConstraintViolation<?>>constraintViolationsパラメーターを受け入れたことです。Set<ConstraintViolation<Sample>>は のサブタイプではないため、Set<ConstraintViolation<?>>コンストラクターに渡すことができず、そうしようとするとコンパイル エラーが発生しました。

Bean 検証 1.1.0では、コンストラクターが代わりに accept に変更されましたSet<? extends ConstraintViolation<?>>。これは のスーパータイプであるSet<ConstraintViolation<Sample>>ため、コンストラクターに直接渡すことができます。

この他の回答で述べたように、まだ Bean Validation 1.0 を使用している間の修正は、次のSet<ConstraintViolation<?>>代わりに a を渡すことでしたSet<ConstraintViolation<Sample>>

throw new ConstraintViolationException(
    new HashSet<ConstraintViolation<?>>(violations));
于 2021-02-02T19:49:45.317 に答える