21

I am puzzled by the javax.validation API. I am writing a simple test to understand it:

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

How should I declare the set of violations so I can use it in my exception constructor?

M. Justin
  • 14,487
  • 7
  • 91
  • 130
Raylite3
  • 837
  • 2
  • 11
  • 22

2 Answers2

18

You can work around this like so:

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

You may be interested in tracking BVAL-198 which addresses this issue.

M. Justin
  • 14,487
  • 7
  • 91
  • 130
Gunnar
  • 18,095
  • 1
  • 53
  • 73
1

This is a known usability issue in Bean Validation 1.0. This issue was addressed in Bean Validation 1.1 by issue BVAL-198, "Simplify creation of ConstraintViolationExceptions". Upgrading to Bean Validation 1.1 or later will allow your code to compile as written.

The specific issue is that the ConstraintViolationException constructors accepted Set<ConstraintViolation<?>> for their constraintViolations parameter. Since Set<ConstraintViolation<Sample>> is not a subtype of Set<ConstraintViolation<?>>, it could not be passed into the constructor, with a compilation error occurring when attempting to do so.

Bean validation 1.1.0 changed the constructors to instead accept Set<? extends ConstraintViolation<?>>. As this is a supertype of Set<ConstraintViolation<Sample>>, it can be passed directly to the constructor.

As mentioned in this other answer, the fix while still on Bean Validation 1.0 was to pass in a Set<ConstraintViolation<?>> instead of Set<ConstraintViolation<Sample>>:

throw new ConstraintViolationException(
    new HashSet<ConstraintViolation<?>>(violations));
M. Justin
  • 14,487
  • 7
  • 91
  • 130