当前位置: 首页 > 知识库问答 >
问题:

无法在ConstraintValidator内使用@Autowired-提供NPE

班泽语
2023-03-14

我有一个自定义的ConstraintValidator来验证@TelephoneNumber注释,如下所示:

@Component
public class TelephoneNumberValidator implements ConstraintValidator<TelephoneNumber, String> {

    @Autowired
    ValidationHelper validationHelper;

    @Override
    public void initialize(TelephoneNumber telephoneNumber) { }

    @Override
    public boolean isValid(String telephoneNumber, ConstraintValidatorContext cxt) {

        if(telephoneNumber == null) {
            return true;
        } else {
            return validationHelper.isTelephoneNumber(telephoneNumber);
        }
    }
}

正如您所见,它自动连接ValidationHelper对象,该对象标记为@Component

在我的@Repository中,每当我通过会话工厂持久化我的对象时。getCurrentSession()。坚持(myobject) validationHelper为空时,我得到一个NPE。

我的hibernate配置是:

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages="uk.co.domain.repositories")
public class HibernateConfig {

    static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
    static final String URL = "jdbc:mysql://localhost:3306/mydatabase";
    static final String USERNAME = "user";
    static final String PASSWORD = "pass";

    @Bean
    public DataSource dataSource() {

        BasicDataSource dataSource = new org.apache.commons.dbcp2.BasicDataSource();
        dataSource.setDriverClassName(DRIVER_CLASS);
        dataSource.setUsername(USERNAME);
        dataSource.setPassword(PASSWORD);
        dataSource.setUrl(URL);
        dataSource.setInitialSize(10);

        return dataSource;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory() {

        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setPackagesToScan(new String[] { "uk.co.domain.models" });

        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {

        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory().getObject());

        return txManager;
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {

        return new PersistenceExceptionTranslationPostProcessor();
    }
}

我已经配置了一个LocalValidatorFactoryBean如下:

@Configuration
@ComponentScan(basePackages="uk.co.domain.validators")
public class ValidatorConfig {

    @Bean
    public MethodValidationPostProcessor methodValidationPostProcessor() {
        MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
        methodValidationPostProcessor.setValidator(validator());
        return methodValidationPostProcessor;
    }

    @Bean
    public LocalValidatorFactoryBean validator() {
        LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean();
        return localValidatorFactoryBean;
    }
}

然而,这并没有解决问题。MVC表单验证工作得非常好,只是Hibernate persist操作失败了。

我需要告诉Hibernate使用这个验证器吗?如果有人给我指点,我将不胜感激。

共有1个答案

方和豫
2023-03-14

正在使用的验证器实例可能不是Spring管理的bean。我怀疑HiberNate正在创建您的验证器实例,并使用该实例而不是您在Spring中创建的实例。

您要么需要让Hibernate使用Spring托管实例,要么找到一个解决方法(要么自己在验证器中实例化它)。考虑使用静态方法——当我验证电话号码时,验证方法通常不需要进行任何数据库调用或需要大量依赖注入的任何东西。

 类似资料:
  • 我使用了本教程,但无法访问索引。带有以下内容的html:http://localhost:8080/或http://localhost:8080/src/main/public/index.html IndexHtmlController:

  • 我有一些UserService对用户实体进行操作。我创建了自己的注释和ConstraintValidator类作为实现 我需要将UserService注入到ConstraintValidator中。而且,正如spring文档所说,在注册bean之后: 不幸的是,它对我没有作用。我在字段(在实现ConstraintValidator的类内)使用NullPointerException累加stackt

  • 当我在中包含LoginViewModelProviderModule时,我无法使用LoginViewModelProviderModule提供LoginViewModel,但当我在ActivityBuilderModule类的@Module注释中包含它时,它可以工作。 BaseApplicationComponent ActivityBuilderModule LoginViewModelProv

  • 有没有任何方法使Spring靴与泽西服务静态内容?我已经学习了一系列关于将Swagger集成到Spring Boot应用程序中的教程和代码示例。我可以让它交付基本的Swagger.json,但我不能让Swagger UI工作。 正如我所说的,我的应用程序运行良好,http://localhost:8080/swagger.json向我显示了普通的json文档,但http://localhost:8

  • 承认,匕首是强硬的,我正试图注射改型。我注入了Context和SharedPreferences,它工作得很好,但改型破坏了这一切。它可以识别DaggerRetrofitComponent类,但不能找到DaggerAppComponent。