Gereksinimler ve Ön Hazırlık
Bu rehberi takip edebilmek için sisteminizde aşağıdaki araçların kurulu olduğundan emin olmalısınız:
- Java Development Kit (JDK) 17 veya 21: Modern dil özelliklerini kullanmak için gereklidir.
- Maven veya Gradle: Bağımlılık yönetimi için.
- Jakarta Bean Validation API: Doğrulama altyapısı için standart kütüphane.
Projenizin pom.xml dosyasına aşağıdaki bağımlılığı ekleyerek işe başlayabilirsiniz:
org.hibernate.validator
hibernate-validator
8.0.1.Final
Bu bağımlılık, kendi özel doğrulayıcılarımızı (validator) yazmamız için gerekli olan ConstraintValidator arayüzünü sağlar.
Adım 1: Özel Annotation Tanımlama
İlk adım, doğrulamak istediğimiz kuralı temsil eden bir annotation oluşturmaktır. Örneğin, bir alanın sadece belirli bir formatta (örneğin "TR-" ile başlayan) veri kabul etmesini istediğimizi varsayalım.
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = TurkiyeFormatValidator.class)
public @interface ValidTurkiyeFormat {
String message() default "Geçersiz format: 'TR-' ile başlamalıdır.";
Class[] groups() default {};
Class
Adım 2: Doğrulayıcı Mantığının (Validator) Uygulanması
Annotation'ımızı tanımladığımıza göre, şimdi bu kuralın arka planda nasıl çalışacağını belirleyen ConstraintValidator sınıfını yazmamız gerekiyor. Bu sınıf, isValid metodunu override ederek iş mantığını barındırır.
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
public class TurkiyeFormatValidator implements ConstraintValidator {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true; // Null değerleri @NotNull ile ayrıca yönetebilirsiniz
}
return value.startsWith("TR-");
}
}
Adım 3: Model Üzerinde Annotation Kullanımı ve Test
Oluşturduğumuz bu özel kuralı artık herhangi bir DTO (Data Transfer Object) sınıfında kullanabiliriz. Spring Boot veya Jakarta Bean Validation destekli bir projede, @Valid etiketi ile bu doğrulama tetiklenecektir.
public class KullaniciKayitDTO {
@ValidTurkiyeFormat
private String vergiNo;
// Getter ve Setter metotları
public String getVergiNo() { return vergiNo; }
public void setVergiNo(String vergiNo) { this.vergiNo = vergiNo; }
}
Performans ve İleri İpuçları
Özel annotation'lar kullanırken uygulamanızın performansını optimize etmek için şu noktalara dikkat etmelisiniz:
- Statik Analiz: Doğrulayıcı sınıflarınızın durumsuz (stateless) olduğundan emin olun.
ConstraintValidator örnekleri genellikle thread-safe olacak şekilde tasarlanmalıdır.
- Ağır İşlemler: Eğer
isValid metodu içerisinde veritabanı sorgusu yapmanız gerekiyorsa, bu durum uygulamanın yanıt süresini ciddi oranda artırabilir. Bu tür durumlarda önbellekleme (caching) mekanizmalarını kullanın.
- Hata Mesajlarını Özelleştirme: Mesajlarınızı
ValidationMessages.properties dosyasında tutarak çoklu dil desteği sağlayabilirsiniz.
Aşağıdaki tablo, özel doğrulayıcı geliştirirken dikkat etmeniz gereken yapısal bileşenleri özetler:
Bileşen
Sorumluluk
@Target
Annotation'ın nereye uygulanacağını belirler (FIELD, METHOD vb.).
@Retention
Annotation'ın çalışma zamanında erişilebilir olmasını sağlar (RUNTIME).
ConstraintValidator
Doğrulama mantığını içeren iş sınıfıdır.
Bu yapı sayesinde, uygulamanızın her yerinde tekrar eden if-else blokları yazmak yerine, sadece bir annotation ekleyerek kodunuzun okunabilirliğini ve bakım maliyetini iyileştirebilirsiniz.


Yorumlar (0)
Yorum Yaz