ConstraintValidator etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
ConstraintValidator etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

12 Temmuz 2018 Perşembe

Bean Validation ConstraintValidator Arayüzü

Giriş
Şu satırı dahil ederiz.
import javax.validation.ConstraintValidator;
Örnek
Şöyle yaparız. İlk template tipi anotasyon ismini gösterir. İkinci tip ise isValid metoduna geçilecek tipi gösterir.
public class CityValidator implements ConstraintValidator<City, String> {
    // ...
}

public class TestClass {
    @City
    String city;
    // ...
}
Örnek
Şöyle yaparız.
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {

  private UserRepository userRepository;

  public UniqueEmailValidator(UserRepository userRepository) {

    this.userRepository = userRepository;
  }

  @Override
  public boolean isValid(String email, ConstraintValidatorContext context) {

    return !userRepository.findByEmail(email).isPresent();
  }
}
Örnek
Önce kullanacağımız anotasyonu tanımlarız. Şöyle yaparız
- @Documented ile bu anotasyonun javadoc içinde olması sağlanır.
- @Constraint ile kullanılacak validator belirtilir.
- @Target ile bu anotasyonun nerede kullanılabileceği belirtilir.
- @Retention RUNTIME yapılır
- message() metodu içinde hata mesajı belirtilir.
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Documented
@Constraint(validatedBy = CustomerIdValidator.class)
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface CustomerId {

    String message() default "Invalid Customer Id";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
Daha sonra anotasyon bir POJO ile kullanılır. Şöyle yaparız
public class Person {

  @CustomerId
  private final String customerId;
  ...
}
Validator için şöyle yaparız
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class CustomerIdValidator implements ConstraintValidator<CustomerId, String> {

  @Override
  public boolean isValid(String customerId,
ConstraintValidatorContext constraintValidatorContext) {
    if(!customerId.isEmpty() && customerId.matches(Constants.CUSTOMER_ID_REGEX)) {
      log.info("Received valid customerId of type 'UUID'");
      return true;
    } else {
      log.error("Received invalid customerId");
      return false;
    }
  }
}