Java Custom Annotation ile Constraint Hazırlama Rehberi
Temel Validation ile verilerinize hükmedin

Herkese iyi çalışmalar. Bugün ki yazımda java ile Validation işlemlerini hem ‘optimize , merkezci ve güvenilir’ hem de Service independent şekilde nasıl hazırlayabileceğimizi anlatıcam. Ama öncesinde bunun öneminden bahsetmek istiyorum.
örnek vermek gerekirse bir programınız var ve program clientlere sahip, ortada bir arayüz var bir etkileşim var. Kullanıcıdan bir kayıt formu almak istiyorsunuz. Alacağınız field’lar ise şöyle : name, surname, email, refCode, address
Validation bu noktada bizi ‘zararlı’ inputlardan koruyan en önemli mekanizmadır. Validation olmayan bir sistemde kullanıcı, ad kısmına email de girebilir, email kısmına telefon numarası da girebilir. Buna benzer tüm senaryolar yaşanabilir. Bunu engellemek için entegre edilen önleme Validation Adı verilir.
Java’nın kendi kütüphanelerinden yararlanarak bunun önüne geçebiliriz. Ama Yazımızın başlığından da anlaşıldığı üzere bunu kendimiz yapacağız. Ama tabi kendimiz yapmadan önce javax.validation kütüphanesini ve bazı Validationlarını tanıtmak istiyorum.
Açıklamalarının ingilizce olmasının nedeni direkt javax.validation içinde ki java doc dan alınmış olmaları.
NotBlank : The annotated element must not be null and must contain at least one non-whitespace character. Accepts CharSequence.
NotNull : The annotated element must not be null. Accepts any type.
Email : The string has to be a well-formed email address. Exact semantics of what makes up a valid email address are left to Jakarta Bean Validation providers. Accepts CharSequence.
Pattern : The annotated CharSequence must match the specified regular expression.
Size : The annotated element size must be between the specified boundaries (included).
Min — Max : The annotated element must be a number whose value must be higher-lower or equal to the specified min-max.
AssertTrue : The annotated element must be true
Son bir örnek kullanım ekleyip, Bu javax konusunu kapatıp Custom Constraint konusuna Geçebiliriz.

Custom Constraint Hazırlayalım
Bunu Aspect Oriented Şekilde Yapacağız. İlk önce Global ölçekte bir Validator Annotation’ı yaratalım.
Ardından validatedBy kısmında referans gösterdiğimiz Validator ları yazabiliriz. Ben örnek için sadece NullOrNotBlankValidator Oluşturucam.
Kodda da görüldüğü üzere artık hem blank Stringleri hem null değerleri saptayıp hem de karakter uzunluklarına göre bir şartlandırma sağlayabildik. Bütün Validatorlarımızın ortak operasyonu olan mesaj set etme methodunu da BaseValidator içerisinde ayarlayalım.
Field Üzerinde Kullanalım
Custom bir şekilde Annotation yazıp, bu mekanizmaya Validatorlar oluşturup tamamen plug-in şekilde implemente ettik. Bir başka Veri tipinde validasyon sağlamanız gerektiğinde sadece ama sadece validatorını yazıp, CustomConstraint annotation’ına referans vermeniz yeterli olacaktır.

Görselden de anlaşıldığı üzere, bir alanın null olup olamayacağı, karakter boyutu, constraint’e regex’e ve nullable durumuna göre custom mesaj alanları da yaratabildik. Bunu aksi halde 3–4 annotation’ı bir arada kullanarak yapmamız gerekicekti ve bu da çok çirkin bir görüntü ortaya çıkarıyor.
Biraz Daha Açıklamak Gerekirse
regexp alanına vereceğiniz Regular expression modeliniz o datanın validate edilip edilmemesini sağlıyor. Örneğin city adlı field’a kimse email giremeyecek. Çünkü BLACK_LIST adlı regex pattern ım içerisinde email var mı diye bakıyor.
Umarım Bu Makale işinize yarar. Okuduğunuz için Teşekkür eder, iyi çalışmalar dilerim.