У меня есть сущность «Пользователь», поле имени пользователя которой аннотировано проверкой @UniqueUsername
. При получении запроса в контроллере я использую аннотацию @Valid
для проверки. Это отлично работает, когда я создаю пользователей. Но у меня проблемы с редактированием существующих пользователей, потому что я не могу заставить Spring игнорировать @UniqueUsername
, поэтому каждое редактирование не выполняется. Есть ли способ заставить Spring игнорировать @UniqueUsername
при редактировании / обновлении информации о пользователе?
Это мой упрощенный код:
User
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
//my custom validator
@UniqueUsername
private String username;
public int getId() {
return id;
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
UniqueUsername
@Constraint(validatedBy = UniqueUsernameValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueUsername {
String message() default "Username already exists";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
UniqueUsernameValidator
@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
private UserDetailsService userDetailsService;
@Override
public void initialize(UniqueUsername username) {
}
@Override
public boolean isValid(String username, ConstraintValidatorContext context) {
return !userDetailsService.isUsernameAlreadyInUse(username);
}
}
Метод в моем контроллере выглядит следующим образом:
public String updateUser(@PathVariable("id") int id, @Valid User user, BindingResult result, Model model)