How to obtain ConstraintValidatorContext?
bean-validation, jakarta-ee, java
Solution
The simple answer is you cannot. ConstraintValidatorContext is an interface and there is no Bean Validation API to get an instance like this. You could write your own implementation, but to implement it properly you would have to re-implement a lot of functionality of a Bean Validation provider. Look for example at the Hibernate Validator specific implementation - https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/java/org/hibernate/validator/internal/engine/constraintvalidation/ConstraintValidatorContextImpl.java
That said, I believe your attempt of reuse is misguided. This is not in the indent of Bean Validation and you are ending up with non portable and hard to maintain code. If you want to reuse existing constraints have a look at constraint composition, for example @NotEmpty reusing @NotNull and @Size
@Documented
@Constraint(validatedBy = { })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@ReportAsSingleViolation
@NotNull
@Size(min = 1)
public @interface NotEmpty {
String message() default "{org.hibernate.validator.constraints.NotEmpty.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
/**
* Defines several {@code @NotEmpty} annotations on the same element.
*/
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
public @interface List {
NotEmpty[] value();
}
}
Problem
I am writing code that has explicit call to Bean Validation (JSR-303) something like this: ``` public class Example { @DecimalMin(value = "0") private static final String ANNOTATED = ""; public void isPossitiveNumber(String str){ ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); ConstraintValidator<DecimalMin, String> validator = factory.getConstraintValidatorFactory().getInstance( DecimalMinValidatorForString.class); validator.initialize( ReflectionUtils.findField(getClass(), "ANNOTATED") .getAnnotation( DecimalMin.class)); boolean isValid = validator.isValid(str, null); return isValid; } } ``` Note the line boolean isValid = validator.isValid(str, null); I transfer `null` for `ConstraintValidatorContext` because I found no way to obtain/construct it. In this particular case, this if fine, because there is no use of the `ConstraintValidatorContext` internally, but it is obvious a hack. How should I get `ConstraintValidatorContext`? ADDED I was asked to provide use-cases. So, for example, I am writting custom validator and I want to reuse exisiting validations. Or I am writting plane Java code as desribed above and I want to reuse exisiting validation.