Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inject EntityManager within ConstraintValidator

Hello I want to inject EntityManager within ConstraintValidator

This is 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 try to inject the 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.

like image 924
Prasetya Utama Avatar asked Jul 04 '26 22:07

Prasetya Utama


1 Answers

You created the UniqueKeyValidator using its constructor (new UniqueKeyValidator()) instead of injecting it (using Spring DI) into your test class.

The CoreConfiguration doesn't contain this validator anyway, so probably Spring doesn't scan it at all. All @Component classes must have a component:scan too.

like image 128
Vlad Mihalcea Avatar answered Jul 07 '26 11:07

Vlad Mihalcea



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!