如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

问题描述 投票:0回答:2

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

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

java generics bean-validation
2个回答
18
投票

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

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

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


1
投票

从 Bean Validation 1.1 开始,您的代码将按编写的方式进行编译。

您遇到了 Bean Validation 1.0 的已知可用性问题。 此问题已在 Bean Validation 1.1 中通过问题 BVAL-198“简化 ConstraintViolationExceptions 的创建”得到解决。

具体问题是,在 Bean Validation 1.0 中,

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

Bean 验证 1.1.0 更改了构造函数以改为接受

Set<? extends ConstraintViolation<?>>
。 由于这是
Set<ConstraintViolation<Sample>>
的超类型,因此该类型的值可以直接传递给构造函数。

正如这个其他答案中提到的,仍在 Bean Validation 1.0 上的修复是传递

Set<ConstraintViolation<?>>
而不是
Set<ConstraintViolation<Sample>>

throw new ConstraintViolationException(
    new HashSet<ConstraintViolation<?>>(violations));
© www.soinside.com 2019 - 2024. All rights reserved.