I have tried several methods to inject dependency into my ConstraintValidator
implementation but nothing is working. I have tried almost all stackoverflow threads. I am using Hibernate Validator to achieve custom validation. I want FileService
to be injected into ApiMockResponseValidator
. I am sharing the things that I have tried.
- Simple
@Autowired
annotation and constructor injection:
@Component
public class ApiMockResponseValidator
implements ConstraintValidator<MockResponse, ApiMockResponse> {
@Autowired
FileService fileService;
private boolean validate(....) {
// logic
}
@Override
public boolean isValid(ApiMockResponse mockResponse, ConstraintValidatorContext context) {
System.out.println("\n\n --- " + fileService + " --- \n\n"); // remains null
// validate()
}
}
I have tried this by Constructor injection only and also by removing @Component
but nothing works and the Validator is not instantiating. Simple @Autowired
is not injecting dependency and constructor autowiring is giving
Caused by: javax.validation.ValidationException: HV000064: Unable to instantiate ConstraintValidator: com.lendin.ib.utils.validator.ApiMockResponseValidator.
at org.hibernate.validator.internal.util.privilegedactions.NewInstance.run(NewInstance.java:44)
...
...
Caused by: java.lang.NoSuchMethodException: com.test.ApiMockResponseValidator.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
- Creating
Validator
bean
@Configuration
public class ValidatorConfig {
@Bean
@Autowired
public Validator validator(AutowireCapableBeanFactory autowireCapableBeanFactory) {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()
.constraintValidatorFactory(
new SpringConstraintValidatorFactory(autowireCapableBeanFactory))
.buildValidatorFactory();
Validator validator = validatorFactory.getValidator();
return validator;
}
}
Even after this fileService
is null.
- Tried creating
LocalValidatorFactoryBean
@Configuration
public class ValidatorConfig {
@Bean
@Primary
@Autowired
public Validator validator(final AutowireCapableBeanFactory autowireCapableBeanFactory) {
new SpringConstraintValidatorFactory(autowireCapableBeanFactory);
LocalValidatorFactoryBean x = new LocalValidatorFactoryBean();
x.setConstraintValidatorFactory(
new SpringConstraintValidatorFactory(autowireCapableBeanFactory));
return x;
}
}
This is also not helping and fileService
is null.
Is there any way I can achieve injecting dependency?
I know that if SpringConstraintValidatorFactory
can instantiate ConstraintValidator
implementation and Hibernate can just use it rather then instantiating the implementation itself then it can work.