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 中的一个已知可用性问题。此问题已在Bean Validation 1.1中的问题BVAL-198 “简化 ConstraintViolationExceptions 的创建”中得到解决。升级到 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 上的修复是传入 aSet<ConstraintViolation<?>>而不是Set<ConstraintViolation<Sample>>

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