Проверка гибернации - autowired возвращает null - PullRequest
0 голосов
/ 06 августа 2020

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

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

Класс 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 {};
        
    }

Аннотации логи c класс. Здесь autowired возвращает null

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();
    }

}

Main

@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();
//  }
    
}

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

Редактировать: Пробовал @ Compon enet

Ответы [ 2 ]

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

РЕДАКТИРОВАТЬ: Мое предложение

Вместо настраиваемого валидатора используйте существующий @EMail и уникальное ограничение:

@Entity
public class User {
  // ...your properties

  @Email
  @Column(unique = true)
  private String email.

  // Rest of class...
}

OLD:

Итак, сначала:

List<User> users = service.retrieveAllUsers();
    if (users.size() > 0) { 

Вы извлекаете всех пользователей из базы данных, просто чтобы проверить, существуют ли какие-либо пользователи? Это очень и очень неэффективно. Если вы уже используете Spring Data, вы можете просто сделать

@Query("SELECT COUNT(*) > 0 FROM Users")
boolean anyExists();

Кроме того, ваша служба не будет введена, потому что EmailValidator - это POJO (простой старый объект java), а не управляемый Spring составная часть. Если вы пометите его с помощью @Component или @Service, Spring позаботится о инъекции.

Но я бы не рекомендовал этого. Я не уверен, каков ваш точный вариант использования, но валидаторы часто используются в Entities, и поэтому они вызываются при создании или обновлении объекта. В таких случаях вы не хотите создавать дополнительные запросы.

Как я уже сказал, я не знаю, чего именно вы пытаетесь достичь, но вы можете использовать существующий валидатор @Email (вы можете даже предоставить настраиваемое регулярное выражение с атрибутом regexp ).

0 голосов
/ 06 августа 2020

Исправлено с добавлением следующего в application.properties. Не знаю почему, но работает

spring.jpa.properties.javax.persistence.validation.mode=none
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...