0

@TelephoneNumber次のように、注釈を検証するためのカスタム ConstraintValidator があります。

@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のオブジェクトを永続化するたびにsessionFactory.getCurrentSession().persist(myobject);、NPEをvalidationHelpernullとして取得します。

私の休止状態の構成は次のとおりです。

@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 の永続化操作だけです。

このバリデーターを使用するように Hibernate に指示する必要がありますか? ポインタをいただければ幸いです。

4

1 に答える 1