У меня есть уникальная проблема валидации поля. Это может относиться к любому уникальному полю на любом объекте, но в моем случае прямо сейчас у меня есть пользователь, и я хочу, чтобы имя пользователя было уникальным в базе данных.Пропустить проверку уникального ограничения бина при редактировании существующего объекта
отрывок из моего пользователя:
@Entity
public class User {
@NotNull
@Column(unique = true)
@UniqueUsername
private String username;
}
UniqueUsername обычая ограничение аннотация следующим образом:
@Constraint(validatedBy = {UniqueUsernameValidator.class})
public @interface UniqueUsername {
String message() default "User already exists with this username";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Тогда UniqueUsernameValidator обычая ограничения валидатор, который просто проверяет базу данных для существующего пользователя с данное имя пользователя:
@ApplicationScoped
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Inject
private UserRepository userRepo;
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
boolean valid = false;
try {
userRepo.findByUsername(value);
} catch (NoResultException e) {
// No result means username not already used
valid = false
}
return valid;
}
}
Теперь для ne w, проверка достоверно работает. Проблема, с которой я сталкиваюсь, - это когда я редактирую пользователя, который уже существует. Когда пользователь обновляется, проверка находит пользователя, которого я сейчас редактирую, возвращает false и отклоняет редактирование.
В идеале мой валидатор, вероятно, будет иметь доступ к/знанию проверяемого объекта пользователя (а не только значения поля), чтобы я мог проверить, был ли дублирующийся объект, который я нашел в базе данных, таким же, как и редактируемый. Но я не могу найти способ сделать это в своем валидаторе.
Кто-нибудь еще сталкивается с этой проблемой и придумывает приемлемое решение?