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







All Articles