Я пытаюсь создать свою аннотацию проверки.
Когда проверка не проходит, это хорошо работает. Я получаю сообщение о. Но когда проверка проходит успешно, я получаю RollbackException.
Что я делаю в моей аннотации валидации?
Я хочу проверить уникальный адрес электронной почты в таблице пользователей. Поэтому я создал @annotation:
package ru.project.domain.validation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Constraint(validatedBy = UniqueEmailValidator.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface UniqueEmail {
public String message() default "e-mail exist!";
public Class<?>[] groups() default {};
public Class<? extends Payload>[] payload() default{};
}
Я создал Validator:
package ru.project.domain.validation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
import ru.project.service.UserService;
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
@Autowired
private UserService userService;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && !userService.isEmailAlredyUse(value);
}
}
Когда я ввожу неуникальное письмо, я получаю сообщение «электронная почта существует!»
Но когда я ввожу уникальный адрес электронной почты, я получаю сообщение об ошибке:
2019-07-07 13: 14: 09.770 ОШИБКА 11680 --- [io-8080-exec-10]
o.h.i.ExceptionMapperStandardImpl: HHH000346: ошибка во время
управляемая очистка [HV000028: непредвиденное исключение во время вызова isValid.]
2019-07-07 13: 14: 09.777 ОШИБКА 11680 --- [io-8080-exec-10]
o.a.c.c.C. [. [. [/]. [dispatcherServlet]: Servlet.service () для
сервлет [dispatcherServlet] в контексте с путем [] вызвал исключение
[Ошибка обработки запроса; вложенное исключение
org.springframework.transaction.TransactionSystemException: не удалось
совершить JPA транзакцию; вложенное исключение
javax.persistence.RollbackException: ошибка при фиксации
транзакция] с первопричиной
java.lang.NullPointerException: null at
ru.project.domain.validation.UniqueEmailValidator.isValid (UniqueEmailValidator.java:17)
~ [классы /: нет] в
ru.project.domain.validation.UniqueEmailValidator.isValid (UniqueEmailValidator.java:1)
~ [классы /: нет] в
org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateSingleConstraint (ConstraintTree.java:171)
~ [hibernate-validator-6.0.17.Final.jar: 6.0.17.Final] в
org.hibernate.validator.internal.engine.constraintvalidation.SimpleConstraintTree.validateConstraints (SimpleConstraintTree.java:68)
~ [hibernate-validator-6.0.17.Final.jar: 6.0.17.Final] в
org.hibernate.validator.internal.engine.constraintvalidation.ConstraintTree.validateConstraints (ConstraintTree.java:73) ...
Функция isValid вызывается дважды. При проверке после нажатия кнопки в форме и при попытке в пользовательском репозитории попытаться сохранить нового пользователя.
Я покажу, что мне каждый раз показывает отладчик.
При нажатии кнопки на форме (уникальный адрес электронной почты):
Когда userRepository пытается сохранить нового пользователя:
ОБНОВЛЕНИЕ: isEmailAlreadyUse:
public boolean isEmailAlredyUse(String value) {
User user = userRepository.findByEmail(value);
if(user != null) {
return true;
}
return false;
}
Во время второго запуска userService = null: