Anotasi Kekangan Tersuai
Cipta anotasi @UniqueEmail tersuai dengan pelaksanaan ConstraintValidator.
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()); // 3Semakan 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.
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
- Pengesahan Bean: @NotNull, @Size, @Pattern
- Anotasi Kekangan Tersuai
- Pengendalian Pengecualian Global dengan @ControllerAdvice
- Butiran Masalah RFC 7807 dan Respons Ralat yang Konsisten