java - 在 ConstraintValidator 中注入(inject) EntityManager

标签 java spring hibernate jpa spring-boot

你好,我想在 ConstraintValidator 中注入(inject) EntityManager

这是我的代码

核心配置

@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

在这个类中,我尝试注入(inject) EntityManager,但它总是返回 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;
    }


}

当我测试代码时,EntityManager 总是给出 null。

最佳答案

您使用其构造函数 (new UniqueKeyValidator()) 创建了 UniqueKeyValidator,而不是将其注入(inject)(使用 Spring DI)到您的测试类中。

CoreConfiguration 无论如何都不包含此 validator ,因此 Spring 可能根本不会扫描它。所有 @Component 类也必须有一个 component:scan

关于java - 在 ConstraintValidator 中注入(inject) EntityManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647940/

相关文章:

java - 在没有可用的entrySet()的情况下迭代NavigableSet

java - 从 elasticsearch 索引或更新查询返回特定字段

spring - Tomcat 中的 LTPA token (Spring security)

java - 使用 id 和对象实例的 JPA 关系

java - 使用 Session.merge() 函数在 hibernate 中合并两个对象时出现问题

java - 不需要命令行参数的程序是否需要 String args[] 参数?

java - 为什么抽象类可以这样实例化?

java - 如何在现有服务结构中实现 "Lock"层

java - 我不明白 Spring 中的 Autowired

hibernate - 使用 Jersey 的 JAX-RS 的 hibernate 资源类中具有连接表的多对一