Özel Kısıtlama Ek Açıklamaları
ConstraintValidator uygulamasıyla özel bir @UniqueEmail ek açıklaması oluşturun.
Özel Kısıtlama Ek Açıklamaları, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
Standart Kısıtlar Yeterli Olmadığında
Standart Bileşen doğrulaması anotasyonları yaygın durumları kapsar. Alanınıza özgü kurallar için (örneğin, benzersiz e-posta, geçerli IBAN veya parola gücü) özel kısıt anotasyonları oluşturun.
Kısıt Anotasyonunu Tanımlama
@Constraint(validatedBy = ...) içeren bir anotasyon oluşturun; gerekli mesaj, grup ve yük öğelerini ve uygun saklama süresi/hedef bilgilerini tanımlayın.
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
@Documented
@Constraint(validatedBy = UniqueEmailValidator.class)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueEmail {
String message() default "Email already registered";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}ConstraintValidator Uygulama
ConstraintValidator<UniqueEmail, String> uygulayın. Başlatma yöntemi anotasyon öğelerini okur; isValid asıl denetimi gerçekleştirir.
@Component
public class UniqueEmailValidator implements ConstraintValidator<UniqueEmail, String> {
@Autowired private UserRepository repo;
@Override
public boolean isValid(String email, ConstraintValidatorContext ctx) {
if (email == null) return true; // let @NotBlank handle null
return !repo.existsByEmail(email);
}
}Özel Kısıtı Kullanma
Anotasyonu bir alan, parametre veya dönüş değeri üzerinde herhangi bir standart kısıt gibi uygulayın.
public record CreateUserRequest(
@NotBlank
String name,
@NotBlank @Email @UniqueEmail
String email
) {}Enterpolasyonla Özel Mesaj
Mesajda anotasyon öğelerine {elementName} kullanarak başvurun. Dinamik veriler içeren özel mesajlar eklemek için ctx.buildConstraintViolationWithTemplate() kullanın.
@Constraint(validatedBy = RangeValidator.class)
public @interface InRange {
int min() default 0;
int max() default 100;
String message() default "Must be between {min} and {max}";
// ...
}Sınıf Düzeyinde Kısıt
Birden çok alanı birlikte doğrulamak için kısıtı sınıf düzeyinde uygulayın; bu, parola doğrulaması gibi alanlar arası kurallar için kullanışlıdır.
@Documented
@Constraint(validatedBy = PasswordMatchValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface PasswordMatch {
String message() default "Passwords do not match";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}Sınıf Düzeyinde Doğrulayıcı Uygulaması
Doğrulayıcı bütün nesneyi alır. Alanlar arası doğrulama yapmak için birden çok alana erişin.
public class PasswordMatchValidator implements ConstraintValidator<PasswordMatch, ChangePasswordRequest> {
public boolean isValid(ChangePasswordRequest req, ConstraintValidatorContext ctx) {
if (req.getNewPassword() == null) return true;
boolean match = req.getNewPassword().equals(req.getConfirmPassword());
if (!match) {
ctx.disableDefaultConstraintViolation();
ctx.buildConstraintViolationWithTemplate("Passwords do not match")
.addPropertyNode("confirmPassword").addConstraintViolation();
}
return match;
}
}Kısıtları Birleştirme
Özel anotasyonunuzu mevcut kısıtlarla işaretleyerek bir meta-kısıt oluşturun. Her ikisi de otomatik olarak uygulanır.
@NotBlank
@Email
@Size(max = 255)
@Constraint(validatedBy = {})
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEmail {
String message() default "Invalid email";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}Birden Çok İhlal Döndürme
Tek bir doğrulayıcı geçişinde bulunan her sorun için ayrı ihlal mesajları eklemek üzere ctx.disableDefaultConstraintViolation() kullanın.
public boolean isValid(String password, ConstraintValidatorContext ctx) {
List<String> issues = new ArrayList<>();
if (password.length() < 8) issues.add("Too short");
if (!password.matches(".*\\d.*")) issues.add("Must contain a digit");
if (issues.isEmpty()) return true;
ctx.disableDefaultConstraintViolation();
issues.forEach(msg -> ctx.buildConstraintViolationWithTemplate(msg).addConstraintViolation());
return false;
}Spring Tarafından Yönetilen Doğrulayıcılar
UniqueEmailValidator, @Component ile işaretlendiği için Spring, veri depolarını buna ekler. Bu yalnızca doğrulayıcı Spring üzerinden başlatılırsa çalışır; Spring Boot bunu otomatik olarak yapılandırır.
Özel Doğrulayıcıları Birim Testine Tabi Tutma
Doğrulayıcıları doğrudan birim testine tabi tutun; saf doğrulama mantığı için Spring bağlamı gerekmez. Bütünleştirme testleri için Validation.buildDefaultValidatorFactory() kullanın.
Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
CreateUserRequest req = new CreateUserRequest("", "bad-email", null);
Set<ConstraintViolation<CreateUserRequest>> violations = validator.validate(req);
System.out.println(violations.size()); // 3Kısa Kontrol
Özel bir kısıt doğrulayıcısı hangi arayüzü uygular?
Özet
@Constraint(validatedBy=...) içeren bir @interface oluşturun. ConstraintValidator uygulayın. Spring bağımlılık eklemesi için @Component kullanın. Sınıf düzeyindeki kısıtlar birden çok alanı birlikte doğrular. Yinelenen tanımları önlemek için mevcut kısıtları birleştirin.
Sıkça Sorulan Sorular
“Özel Kısıtlama Ek Açıklamaları” dersi ücretsiz mi?
Evet — “Özel Kısıtlama Ek Açıklamaları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“Özel Kısıtlama Ek Açıklamaları” dersinde ne öğreneceğim?
ConstraintValidator uygulamasıyla özel bir @UniqueEmail ek açıklaması oluşturun. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Özel Kısıtlama Ek Açıklamaları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Bean Doğrulaması: @NotNull, @Size, @Pattern
- Özel Kısıtlama Ek Açıklamaları
- @ControllerAdvice ile Genel İstisna Yönetimi
- RFC 7807 Problem Ayrıntıları ve Tutarlı Hata Yanıtları