Я постараюсь игнорировать другие детали и укорочу:
@Entity
public class User
@UniqueEmail
@Column(unique = true)
private String email;
}
@Component
public class UniqueEmailValidatior implements ConstraintValidator<UniqueEmail,String>, InitializingBean {
@Autowired private UserService userService;
@Override
public void initialize(UniqueEmail constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(userService == null) throw new IllegalStateException();
if(value == null) return false;
return !userService.isEmailExisted(value);
}
}
Это будет работать, когда проверка выполняется весной (Spring MVC @Valid
или вводит Validator
с использованием @Autowire
), все будет хорошо.
Но как только я сохраню сущность, используя Spring Data JPA:
User save = userRepository.save(newUser);
Hibernate попытается создать новый UniqueEmailValidatior
без внедрения bean-компонента UserService
.
Итак, как я могу заставить Hibernate использовать мой UniqueEmailValidatior
компонент без его создания нового.
Я мог бы отключить проверку гибернации, используя spring.jpa.properties.javax.persistence.validation.mode=none
, но я надеюсь, что есть другой способ
Обновление: вот мой UserService:
@Autowired private Validator validator;
@Transactional
public SimpleUserDTO newUser(UserRegisterDTO user) {
validator.validate(user);
System.out.println("This passes");
User newUser = new User(user.getUsername(),
passwordEncoder.encode(user.getPassword()),user.getEmail(),
"USER",
user.getAvatar());
User save = userRepository.save(newUser);
System.out.println("This won't pass");
return ....
}