Autowried в ограничении гибернации, валидатор возвращает nullexception - PullRequest
0 голосов
/ 03 августа 2020

Осмотревшись, я не смог найти никакого хорошего решения для этого.

Моя autowired не работала должным образом, когда она возвращала null. Я автоматически подключил этот конкретный класс к другим классам, и он работает, поэтому он не работает только в классах проверки ограничений.

Ошибка

java .lang.IllegalStateException: Не удалось выполните CommandLineRunner в org.springframework.boot.SpringApplication.callRunner (SpringApplication. java: 798) ~ [spring-boot-2.3.1.RELEASE.jar: 2.3.1.RELEASE] в org.springframework.boot.SpringApplication. callRunners (SpringApplication. java: 779) ~ [spring-boot-2.3.1.RELEASE.jar: 2.3.1.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication. java: 322) ~ [spring-boot-2.3.1.RELEASE.jar: 2.3.1.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication. java: 1237) ~ [spring-boot-2.3.1.RELEASE. jar: 2.3.1.RELEASE] в org.springframework.boot.SpringApplication.run (SpringApplication. java: 1226) ~ [spring-boot-2.3.1.RELEASE.jar: 2.3.1.RELEASE] в com. Alex.Mains.JpaApplication.main (JpaApplication. java: 21) ~ [классы /: na] Вызвано: org.springframework.transac tion.TransactionSystemException: не удалось зафиксировать транзакцию JPA; вложенным исключением является javax.persistence.RollbackException: Ошибка при фиксации транзакции в org.springframework.orm.jpa.JpaTransactionManager.doCommit (JpaTransactionManager. java: 543) ~ [spring-orm-5.2.7.RELEASE.jar: 5.2 .7.RELEASE] в org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit (AbstractPlatformTransactionManager. java: 743) ~ [spring-tx-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в orgramework.spring .transaction.support.AbstractPlatformTransactionManager.commit (AbstractPlatformTransactionManager. java: 711) ~ [spring-tx-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.transaction.interceptor.TransactionAfterTransaction.comRELEASE.com TransactionAspectSupport. java: 632) ~ [spring-tx-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport. java: 386 *1038*: [spring-tx-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.transaction.in terceptor.TransactionInterceptor.invoke (TransactionInterceptor. java: 118) ~ [spring-tx-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.proceed (ReflectiveMethod). 1040 *: 186) ~ [spring-aop-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke (PersistenceExceptionTranslationInterceptor. java: 139) ~ [spring- tx-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation. java: 186) ~ [spring-aop-5.2.7.RELEASE.jar : 5.2.7.RELEASE] в org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor $ CrudMethodMetadataPopulatingMethodInterceptor.invoke (CrudMethodMetadataPostProcessor. 178-jpa ~: 2.3-ja-rus-dataPostProcessor. 2.3.1.RELEASE] в org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation. java: 186) ~ [spring-aop-5.2.7.RELEASE.jar: 5.2.7.RE АРЕНДА] в org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke (ExposeInvocationInterceptor. java: 95) ~ [spring-aop-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.aop. framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation. java: 186) ~ [spring-aop-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в org.springframework.aop.framework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.invoke 1047 *: 212) ~ [spring-aop-5.2.7.RELEASE.jar: 5.2.7.RELEASE] в com.sun.proxy. $ Proxy93.save (Неизвестный источник) ~ [na: na] в com.Alex .Mains.UserRepositoryCommandLineRunner.run (UserRepositoryCommandLineRunner. java: 26) ~ [классы /: na] в org.springframework.boot.SpringApplication.callRunner (SpringApplication. java: 795) ~ [spring-boot-2.3.1.RELEASE.jar: 2.3.1.RELEASE] ... 5 общих кадров пропущены Причина: javax.persistence.RollbackException: ошибка при фиксации транзакции в org.hibernate.internal.ExceptionConverterImpl. convertCommitException (ExceptionConverterImpl. java: 81) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.engine.transaction.internal.TransactionImpl.commit (TransactionImpl. java : 104) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.springframework.orm.jpa.JpaTransactionManager.doCommit (JpaTransactionManager. java: 534) ~ [spring-orm- 5.2.7.RELEASE.jar: 5.2.7.RELEASE] ... 21 общий кадр пропущен Причина: javax.validation.ValidationException: HV000028: Неожиданное исключение во время вызова isValid. в org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint (ConstraintTree. java: 186) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate. validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints (SimpleConstraintTree. java: 62) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.engine .constraintvalidation.ConstraintTree.validateConstraints (ConstraintTree. java: 75) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.metadata.core.MetaConstraint. doValidateConstraint (MetaConstraint. java: 130) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.metadata.core.MetaConstraint.validateConstraint (MetaConstraint. java: 123) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.engine.ValidatorImpl.validateMetaConstraint (ValidatorImpl. java: 555) ~ [ спящий режим-валидатор- 6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForSingleDefaultGroupElement (ValidatorImpl. java: 518) ~ [hibernate-validator-6.1.5.Final.jar : 6.1.5.Final] в org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForDefaultGroup (ValidatorImpl. java: 488) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.engine.ValidatorImpl.validateConstraintsForCurrentGroup (ValidatorImpl. java: 450) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator. internal.engine.ValidatorImpl.validateInContext (ValidatorImpl. java: 400) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.validator.internal.engine.ValidatorImpl.validate (ValidatorImpl. java: 172) ~ [hibernate-validator-6.1.5.Final.jar: 6.1.5.Final] в org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate (BeanValidationEventListener. java: 116) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Fi nal] в org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert (BeanValidationEventListener. java: 80) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.action. internal.EntityInsertAction.preInsert (EntityInsertAction. java: 227) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.action.internal.EntityInsertAction.execute (EntityInsertAction. java: 100) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.engine.spi.ActionQueue.executeActions (ActionQueue. java: 604) ~ [hibernate- core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.engine.spi.ActionQueue.lambda $ executeActions $ 1 (ActionQueue. java: 478) ~ [hibernate-core-5.4.17. Final.jar: 5.4.17.Final] в java .base / java .util.LinkedHashMap.forEach (LinkedHashMap. java: 723) ~ [na: na] at org.hibernate.engine.spi. ActionQueue.executeActions (ActionQueue. java: 475) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.event.internal.AbstractFlushingEventListener.performExecution s (AbstractFlushingEventListener. java: 348) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.event.internal.DefaultFlushEventListener.onFlu sh (DefaultFlushEventListener. java: 40) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener (EventListenerGroupImpl. java: 102) ~ [hibernate-core-5.4 .17.Final.jar: 5.4.17.Final] в org.hibernate.internal.SessionImpl.doFlu sh (SessionImpl. java: 1360) ~ [hibernate-core-5.4.17.Final.jar: 5.4 .17.Final] в org.hibernate.internal.SessionImpl.managedFlu sh (SessionImpl. java: 451) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org. hibernate.internal.SessionImpl.flushBeforeTransactionCompletion (SessionImpl. java: 3210) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.internal.SessionImpl.beforeTransactionCompletion (SessionImpl. java: 2378) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.engine.jdb c .internal.JdbcCoordinatorImpl.beforeTransactionCompletion (JdbcCoordinatorImpl. java: 447 ) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.resource.transaction.backend.jdb c .internal.JdbcResourceL ocalTransactionCoordinatorImpl.beforeCompletionCallback (JdbcResourceLocalTransactionCoordinatorImpl. java: 183) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.resource.transaction.backend.jdb * .internal * .internal * .internal * .internal *. JdbcResourceLocalTransactionCoordinatorImpl.access $ 300 (JdbcResourceLocalTransactionCoordinatorImpl. java: 40) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.resource.transaction.backend90.jdb * .internal 10 .JdbcResourceLocalTransactionCoordinatorImpl $ TransactionDriverControlImpl.commit (JdbcResourceLocalTransactionCoordinatorImpl. java: 281) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] в org.hibernate.engine.transaction TransactionImpl. java: 101) ~ [hibernate-core-5.4.17.Final.jar: 5.4.17.Final] ... 22 общих кадра пропущены Причина: java .lang.NullPointerException: null в com. Alex.Validations.EmailValidator.isValid (EmailValidator. java: 26) ~ [classes /: na] в com.Alex.Validations.EmailValidator.isValid (EmailValid ator. java: 1) ~ [классы /: na] в org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint (ConstraintTree. java: 180) ~ [hibernate-validator-6.1.5. Final.jar: 6.1.5.Final]

Класс UserService

@Service
public class UserService {

    @Autowired
    private UserRepository userRep;
    
    public void addUser(User user) {
        userRep.save(user);
    }
    
    
    public void deleteUser(long userId) {
        userRep.deleteById(userId);
    }
    
    public List<User> retrieveAllUsers(){
        Iterable<User>temp =userRep.findAll();
        List<User>allUsers = null;
        temp.forEach(allUsers::add);
        return allUsers;
    }
    
    public boolean searchByEmail(String email) {
        return userRep.findByEmail(email);
    }
    
    public void updateUser(User user) {
        userRep.save(user);
    }
}

Класс интерфейса аннотации

 @Target(ElementType.FIELD) 
    //When will the annotation be processed compilation, runtime etc
    @Retention(RetentionPolicy.RUNTIME)
    //Where is the logic
    @Constraint(validatedBy = EmailValidator.class)
    @Documented
    public @interface ValidEmail {
        
        //Error message
        String message() default "Invalid email";
        //Required for annotation
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
        
    }

Logi аннотаций c класс

public class EmailValidator implements ConstraintValidator<ValidEmail, String> {

    @Autowired
    private UserService service;
    //Actual place to place the logic to check if the data is valid or not
    @Override
    public boolean isValid(String email, ConstraintValidatorContext context) {
        if (email == null) {
        return false;
        }
        
        List<User> users = service.retrieveAllUsers();
        if (users.size() > 0) { 
        return Pattern.matches("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", email)
                && service.searchByEmail(email);
        }
        
        else {
            return Pattern.matches("(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", email);
        }
        }
        
    
    
    @Override
    public void initialize(ValidEmail validEmail) {
        validEmail.message();
    }

}

Основной

@SpringBootApplication
@ComponentScan(basePackages = {
        "com.Alex.Mains", "com.Alex.UserPackage", "com.Alex.Flights", "com.Alex.Security"
})
@EntityScan( basePackages = {"com.Alex.UserPackage", "com.Alex.Flights"})
@EnableJpaRepositories({"com.Alex.UserPackage", "com.Alex.Flights"})
public class JpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(JpaApplication.class, args);
    }
    
//  @Bean
//  public Validator validator(final AutowireCapableBeanFactory beanFactory) {
//
//      ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
//              .configure()
//              .constraintValidatorFactory(new SpringConstraintValidatorFactory(beanFactory))
//              .buildValidatorFactory();
//
//      return validatorFactory.getValidator();
//  }
    
}

введите описание изображения здесь

1 Ответ

1 голос
/ 04 августа 2020

Hibernate вызывает проверку, и по умолчанию он ничего не знает о Spring, поэтому стереотип @Autowired не будет соблюдаться.

Если вы хотите использовать Spring там, вам необходимо настроить Hibernate чтобы иметь возможность правильно разрешить внедрение зависимостей.

Я не могу знать наверняка, так как вы не поделились образцом, который мы можем запустить, но попробуйте добавить следующую конфигурацию:

@Configuration
class HibernateCustomization {

    @Bean
    public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(ValidatorFactory validatorFactory) {
        return (properties) -> {
            properties.put(org.hibernate.cfg.AvailableSettings.JPA_VALIDATION_FACTORY, validatorFactory);
        };
    }
}
...