Does this type of validation work?
Annotation:
@Constraint(validatedBy = UniqueEmailValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface UniqueEmail {
public String message() default "Error message";
public Class<?>[] groups() default {};
public Class<? extends Payload>[] payload() default {};
}
Validator:
@Component
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
@Autowired
private UserRepository userRepository;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return userService.isEmailUnique(value); // read as a call to userRepository.findByEmail(emailAddress)
}
}
And the entity
@Entity
public class User {
...
@UniqueEmail
private String email;
}
It fails because of the recursive calls between isValid()
method and userRepository.findByEmail()
. It this correct behavior? Does the findByEmail
always create a new User and apply the validation on it?
update:
A part of the stacktrace:
java.lang.StackOverflowError: null
...
(many times)
...
UserService.isEmailUnique(UserService.java:84)
...
UniqueEmailValidator.isValid(UniqueEmailValidator.java:29)
UniqueEmailValidator.isValid(UniqueEmailValidator.java:13)
The property spring.jpa.properties.javax.persistence.validation.mode=none
resolves this. But still it was not even a double validation
.