如何在 Bean Validation 1.0 中构造 ConstraintViolationException?

2022-09-02 10:38:54

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

我应该如何声明冲突集,以便我可以在异常构造函数中使用它?


答案 1

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

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

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


答案 2

这是 Bean 验证 1.0 中已知的可用性问题。此问题已在 Bean 验证 1.1 中通过问题 BVAL-198 “简化约束暴力异常的创建”得到解决。升级到 Bean 验证 1.1 或更高版本将允许您的代码按编写进行编译。

具体问题是约束暴力异常构造函数被接受为其参数。由于 不是 的子类型,因此无法将其传递到构造函数中,并且在尝试这样做时会发生编译错误。Set<ConstraintViolation<?>>constraintViolationsSet<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));

推荐