I hope the solution will help someone:
@Bean
public Validator validator () {
ValidatorFactory validatorFactory = Validation.byProvider( HibernateValidator.class )
.configure().constraintValidatorFactory(new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
Initializing the validator with SpringConstraintValidatorFactory
so that injection works and providing the validator implementation to be Hibernate.class works in the following manner:
- Your objects will be validated by the library of your choice
- Your custom validators will be able to use Spring’s functionality while having validation to be executed by Hibernate.
How it works:
Hibernate’s ConstraintValidatorFactory
does not initialize any ConstraintValidators
unless they are called but SpringConstraintValidatorFactory
does by giving AutowireCapableBeanFactory
to it.
EDIT
As mentioned in one of the comments by @shabyasaschi To inject autowireCapableBeanFactory
you can change the method signature as:
Validator validator(final AutowireCapableBeanFactory autowireCapableBeanFactory) {
or add getter and setter for it in the config file as follows:
public AutowireCapableBeanFactory getAutowireCapableBeanFactory() {
return autowireCapableBeanFactory;
}
public void setAutowireCapableBeanFactory(AutowireCapableBeanFactory autowireCapableBeanFactory) {
this.autowireCapableBeanFactory = autowireCapableBeanFactory;
}