如何构造ConstraintViolationException?

时间:2012-08-23 17:13:11

标签: java generics bean-validation

我对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);
}

我应该如何声明违规行为,以便在异常构造函数中使用它?

2 个答案:

答案 0 :(得分:10)

你可以像这样解决这个问题:

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

您可能有兴趣跟踪解决此问题的BVAL-198

答案 1 :(得分:0)

这是 Bean Validation 1.0 中的一个已知可用性问题。此问题已在 Bean Validation 1.1 中通过问题 BVAL-198“简化 ConstraintViolationExceptions 的创建”得到解决。升级到 Bean Validation 1.1 或更高版本将允许您的代码按照编写的方式进行编译。

具体问题是 ConstraintViolationException 构造函数接受 constraintViolations 作为其 Set<ConstraintViolation<Sample>> 参数。由于 Set<ConstraintViolation<?>> 不是 Set<? extends ConstraintViolation<?>> 的子类型,因此无法将其传递给构造函数,尝试这样做时会发生编译错误。

Bean 验证 1.1.0 changed the constructors 改为接受 Set<ConstraintViolation<Sample>>。由于这是 Set<ConstraintViolation<?>> 的超类型,因此可以直接传递给构造函数。

this other answer 中所述,仍在 Bean Validation 1.0 上的修复是传入 Set<ConstraintViolation<Sample>> 而不是 throw new ConstraintViolationException( new HashSet<ConstraintViolation<?>>(violations));

Avg by (server) (HttpStatusCodes{category = 'Api.ResponseStatus'}) limit 10