Java Academy · Pelajaran

Anotasi Kekangan Tersuai

Cipta anotasi @UniqueEmail tersuai dengan pelaksanaan ConstraintValidator.

Pelajaran 2 daripada 413 langkah

Anotasi Kekangan Tersuai ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apabila Kekangan Standard Tidak Mencukupi

Anotasi Pengesahan Bean standard meliputi kes biasa. Untuk peraturan khusus domain (contohnya, e-mel unik, IBAN yang sah dan kekuatan kata laluan), cipta anotasi kekangan tersuai.

Mentakrifkan Anotasi Kekangan

Cipta anotasi dengan @Constraint(validatedBy = ...), elemen message, groups dan payload yang diperlukan, serta pengekalan/sasaran yang sesuai.

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 {};
}

Melaksanakan ConstraintValidator

Laksanakan ConstraintValidator<UniqueEmail, String>. Kaedah initialize membaca elemen anotasi; isValid menjalankan semakan sebenar.

@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);
    }
}

Menggunakan Kekangan Tersuai

Gunakan anotasi seperti mana-mana kekangan standard pada medan, parameter atau nilai pulangan.

public record CreateUserRequest(
    @NotBlank
    String name,
    @NotBlank @Email @UniqueEmail
    String email
) {}

Mesej Tersuai dengan Interpolasi

Rujuk elemen anotasi dalam mesej menggunakan {elementName}. Gunakan ctx.buildConstraintViolationWithTemplate() untuk menambahkan mesej tersuai dengan data dinamik.

@Constraint(validatedBy = RangeValidator.class)
public @interface InRange {
    int min() default 0;
    int max() default 100;
    String message() default "Must be between {min} and {max}";
    // ...
}

Kekangan Peringkat Kelas

Gunakan kekangan pada peringkat kelas untuk mengesahkan beberapa medan bersama-sama — berguna untuk peraturan merentas medan seperti pengesahan kata laluan.

@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 {};
}

Pelaksanaan Pengesah Peringkat Kelas

Pengesah menerima keseluruhan objek. Akses beberapa medan untuk menjalankan pengesahan merentas medan.

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;
    }
}

Menggabungkan Kekangan

Cipta kekangan meta dengan menganotasi anotasi tersuai anda menggunakan kekangan sedia ada. Kedua-duanya digunakan secara automatik.

@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 {};
}

Memulangkan Pelanggaran Berbilang

Gunakan ctx.disableDefaultConstraintViolation() dan tambahkan mesej pelanggaran individu bagi setiap isu yang ditemui dalam satu laluan pengesah.

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;
}

Pengesah yang Diurus Spring

Memandangkan UniqueEmailValidator dianotasi dengan @Component, Spring menyuntik repositori ke dalamnya. Ini hanya berfungsi jika pengesah dimulakan melalui pengesah Spring, yang disambungkan oleh Spring Boot secara automatik.

Menguji Pengesah Tersuai

Jalankan ujian unit pada pengesah secara terus — konteks Spring tidak diperlukan untuk logik pengesahan tulen. Gunakan Validation.buildDefaultValidatorFactory() untuk ujian integrasi.

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
CreateUserRequest req = new CreateUserRequest("", "bad-email", null);
Set<ConstraintViolation<CreateUserRequest>> violations = validator.validate(req);
System.out.println(violations.size()); // 3

Semakan Pantas

Apakah antara muka yang dilaksanakan oleh pengesah kekangan tersuai?

Ringkasan

Cipta @interface dengan @Constraint(validatedBy=...). Laksanakan ConstraintValidator. Gunakan @Component untuk suntikan Spring. Kekangan peringkat kelas mengesahkan beberapa medan bersama-sama. Gabungkan kekangan sedia ada untuk mengelakkan penduaan.

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
104
Pelajaran
374

Soalan Lazim

Adakah pelajaran “Anotasi Kekangan Tersuai” percuma?

Ya — teks penuh “Anotasi Kekangan Tersuai” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Anotasi Kekangan Tersuai”?

Cipta anotasi @UniqueEmail tersuai dengan pelaksanaan ConstraintValidator. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Java Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Anotasi Kekangan Tersuai” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pengesahan Bean: @NotNull, @Size, @Pattern
  2. Anotasi Kekangan Tersuai
  3. Pengendalian Pengecualian Global dengan @ControllerAdvice
  4. Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten
← Kembali ke Java Academy