Inject EntityManager inside ConstraintValidator
Hello I want to add EntityManager to ConstraintValidator
These are my codes
CoreConfiguration
@Configuration
public class CoreConfiguration {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
@Bean(name="validator")
public static LocalValidatorFactoryBean validator() {
LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
/* * ReloadableResourceBundleMessageSource messageSource = new
* ReloadableResourceBundleMessageSource();
* messageSource.setBasename("/WEB-INF/messages/validation");
* localValidatorFactoryBean.setValidationMessageSource(messageSource);*/
return localValidatorFactoryBean;
}
}
UniqueKeyValidator.java
In this class I am trying to inject EntityManager but it always gives null
@Component
public class UniqueKeyValidator implements
ConstraintValidator<Unique, Serializable> {
@PersistenceContext
private EntityManager entityManager;
private Class<?> entityClass;
private String uniqueField;
public void initialize(Unique unique) {
entityClass = unique.entity();
uniqueField = unique.property();
}
@Transactional
public boolean isValid(Serializable property,
ConstraintValidatorContext cvContext) {
String query = String.format("from %s where %s = :val ",entityClass.getName(), uniqueField);
List<?> list = entityManager.createQuery(query).setParameter("val", property).getResultList();
return list != null && list.size() > 0;
}
}
When I test the code, the EntityManager always gives null.
+3
source to share
1 answer
You created UniqueKeyValidator
with your constructor ( new UniqueKeyValidator()
) instead of injecting it (using Spring DI) into your test class.
CoreConfiguration doesn't contain this validator anyway, so it's likely Spring doesn't scan it at all. All classes @Component
must also have component:scan
.
+1
source to share