我有一個獨特的字段valiation問題。這可能適用於任何對象上的任何唯一字段,但就我而言,現在我有一個用戶,並且我希望用戶名在數據庫中是唯一的。編輯現有實體時跳過唯一的約束bean驗證
甲從我的用戶片段:
@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是一個自定義約束驗證器,簡單地檢查DB,用於與現有的用戶給定用戶名:
@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並拒絕編輯。
理想情況下,我的驗證器可能會訪問/知道正在驗證的用戶對象(而不僅僅是字段值),以便我可以檢查在數據庫中找到的重複對象是否與正在編輯的相同。但我無法在驗證器中找到這樣做的方法。
其他人遇到這個問題,並拿出一個可接受的解決方案?