1. Gambaran keseluruhan
Dalam tutorial ringkas ini, kita membahas asas-asas mengesahkan kacang Jawa dengan kerangka standard - JSR 380, juga dikenal sebagai Bean Validation 2.0 .
Mengesahkan input pengguna adalah keperluan yang sangat biasa di kebanyakan aplikasi. Dan kerangka Java Bean Validation telah menjadi standard de facto untuk menangani logik seperti ini.
2. JSR 380
JSR 380 adalah spesifikasi Java API untuk validasi kacang, bagian dari Jakarta EE dan JavaSE. Ini memastikan bahawa sifat kacang memenuhi kriteria tertentu, menggunakan anotasi seperti @NotNull , @Min , dan @Max .
Versi ini memerlukan Java 8 atau lebih tinggi, dan memanfaatkan fitur baru yang ditambahkan di Java 8, seperti anotasi jenis dan sokongan untuk jenis baru seperti Opsyen dan Tempatan Tempatan .
Untuk maklumat lengkap mengenai spesifikasi, teruskan dan baca JSR 380.
3. Kebergantungan
Kami akan menggunakan contoh Maven untuk menunjukkan kebergantungan yang diperlukan. Tetapi tentu saja, balang ini boleh ditambah dengan pelbagai cara.
3.1. API Pengesahan
Menurut spesifikasi JSR 380, kebergantungan api-valid berisi API pengesahan standard:
javax.validation validation-api 2.0.1.Final
3.2. Pelaksanaan Rujukan API Pengesahan
Hibernate Validator adalah pelaksanaan rujukan API pengesahan.
Untuk menggunakannya, kita perlu menambahkan kebergantungan berikut:
org.hibernate.validator hibernate-validator 6.0.13.Final
Nota ringkas: hibernate-validator sepenuhnya terpisah dari aspek kegigihan Hibernate. Oleh itu, dengan menambahkannya sebagai ketergantungan, kami tidak menambahkan aspek kegigihan ini ke dalam projek.
3.3. Ketergantungan Bahasa Ekspresi
JSR 380 menyokong interpolasi berubah-ubah, yang memungkinkan ungkapan di dalam mesej pelanggaran.
Menghuraikan Ungkapan ini, kami akan menambah javax.el pergantungan dari glassfish, yang mengandungi pelaksanaan spesifikasi Expression Bahasa:
org.glassfish javax.el 3.0.0
4. Menggunakan Anotasi Pengesahan
Di sini, kami akan mengambil kacang pengguna dan berusaha menambahkan beberapa pengesahan ringkas kepadanya:
import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; import javax.validation.constraints.Email; public class User { @NotNull(message = "Name cannot be null") private String name; @AssertTrue private boolean working; @Size(min = 10, max = 200, message = "About Me must be between 10 and 200 characters") private String aboutMe; @Min(value = 18, message = "Age should not be less than 18") @Max(value = 150, message = "Age should not be greater than 150") private int age; @Email(message = "Email should be valid") private String email; // standard setters and getters }
Semua anotasi yang digunakan dalam contoh adalah anotasi JSR standard:
- @NotNull mengesahkan bahawa nilai harta tanah yang dijelaskan tidak kosong .
- @AssertTrue mengesahkan bahawa nilai harta tanah yang dijelaskan adalah benar.
- @Size mengesahkan bahawa nilai harta tanah yang dijelaskan mempunyai ukuran antara atribut min dan max ; dapat diterapkan pada String , Collection , Map , dan array array.
- @Min mengesahkan bahawa harta yang diberi penjelasan mempunyai nilai tidak lebih kecil daripadaatribut nilai .
- @Max mengesahkan bahawa harta yang diberi penjelasan mempunyai nilai tidak lebih besar daripadaatribut nilai .
- @Email mengesahkan bahawa harta yang dilampirkan adalah alamat e-mel yang sah.
Beberapa anotasi menerima atribut tambahan, tetapi atribut mesej adalah umum untuk semua itu. Ini adalah mesej yang biasanya akan diberikan apabila nilai harta tanah masing-masing gagal disahkan.
Dan beberapa anotasi tambahan yang terdapat di JSR:
- @NotEmpty mengesahkan bahawa harta tanah itu tidak kosong atau kosong; dapat diterapkan pada nilai String , Collection , Map atau Array .
- @NotBlank hanya dapat diterapkan pada nilai teks dan mengesahkan bahawa harta itu tidak kosong atau ruang kosong.
- @Positive and @PositiveOrZero apply to numeric values and validate that they are strictly positive, or positive including 0.
- @Negative and @NegativeOrZero apply to numeric values and validate that they are strictly negative, or negative including 0.
- @Past and @PastOrPresent validate that a date value is in the past or the past including the present; can be applied to date types including those added in Java 8.
- @Future and @FutureOrPresent validate that a date value is in the future, or in the future including the present.
The validation annotations can also be applied to elements of a collection:
List preferences;
In this case, any value added to the preferences list will be validated.
Also, the specification supports the new Optional type in Java 8:
private LocalDate dateOfBirth; public Optional getDateOfBirth() { return Optional.of(dateOfBirth); }
Here, the validation framework will automatically unwrap the LocalDate value and validate it.
5. Programmatic Validation
Some frameworks — such as Spring — have simple ways to trigger the validation process by just using annotations. This is mainly so that we don't have to interact with the programmatic validation API.
Now let's go the manual route and set things up programmatically:
ValidatorFactory factory = Validation.buildDefaultValidatorFactory(); Validator validator = factory.getValidator();
To validate a bean, we first need a Validator object, which is built using a ValidatorFactory.
5.1. Defining the Bean
We're now going to set up this invalid user — with a null name value:
User user = new User(); user.setWorking(true); user.setAboutMe("Its all about me!"); user.setAge(50);
5.2. Validate the Bean
Now that we have a Validator, we can validate our bean by passing it to the validate method.
Any violations of the constraints defined in the User object will be returned as a Set:
Set
violations = validator.validate(user);
By iterating over the violations, we can get all the violation messages using the getMessage method:
for (ConstraintViolation violation : violations) { log.error(violation.getMessage()); }
In our example (ifNameIsNull_nameValidationFails), the set would contain a single ConstraintViolation with the message “Name cannot be null”.
6. Conclusion
Artikel ini memfokuskan pada jalan mudah melalui Java Validation API standard. Kami menunjukkan asas pengesahan kacang menggunakan anotasi dan API javax.validation .
Seperti biasa, penerapan konsep dalam artikel ini dan semua coretan kod dapat ditemukan di GitHub.