Java İle Custom Annotation Kullanarak Dinamik Doğrulama Nasıl Yapılır?

Java İle Custom Annotation Kullanarak Dinamik Doğrulama Nasıl Yapılır?
Java İle Custom Annotation Kullanarak Dinamik Doğrulama Nasıl Yapılır?

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.

Bu yazıya tepkinizi paylaşın:
Zeynep Arslan

Mutfak pratikleri ve organizasyonel hayat tüyoları üzerine uzman bir içerik üreticisiyim. Günlük rutinleri optimize eden yöntemleri, anlaşılır ve uygulanabilir rehberler haline getiriyorum.

Yorumlar (0)

Yorum Yaz