Cześć, stworzyłem walidator @Unique, który stosuje w moich modelach :) Oto on:
Unique.java
@Documented
@Constraint(validatedBy = UniqueValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Unique {
String message() default "must be unique";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
Class<?> entity();
String property();
}
UniqueValidator.java
public class UniqueValidator implements ConstraintValidator<Unique, Serializable> {
@Autowired
private SessionFactory sessionFactory;
private Class<?> entityClass;
private String uniqueField;
public void initialize(Unique unique) {
entityClass = unique.entity();
uniqueField = unique.property();
}
@Transactional
public boolean isValid(Serializable property, ConstraintValidatorContext cvContext) {
Criteria crit = sessionFactory.getCurrentSession().createCriteria(entityClass);
crit.add(Restrictions.eq(uniqueField, property));
return crit.list().isEmpty();
}
}
Chciałem go zastosować w modelu User, a konkretnie dla pola:
@NotEmpty
@Unique(entity = User.class, property = "username")
private String username;
Wszystko jest ładnie walidowane przy tworzeniu użytkownika - nie pozwoli na utworzenie takiego drugiego użytkownika o tej samej nazwie. W swoim systemie mam jednak również możliwość edycji danych użytkownika przez administratora i tutaj mam kłopot, gdyż w walidując formularz edycji walidator nie przepuści mnie również dalej :/
I tutaj pytanie... czy jest możliwość, aby walidator UniqueValidator zadziałał tylko przy metodzie persist(), a przy merge() już nie??
Chyba, że jest jakiś fajniejszy sposób na rozwiązanie tego problemu. Bardzo proszę o poradę :)